我們可以定義指針變量指向任何類型的變量。在上述的處理過程中,指針變量指向的變量通過傳遞變量的地址來實(shí)現(xiàn)。指針變量的取值是內(nèi)存的地址,這個(gè)地址應(yīng)當(dāng)是安全的,不可以是隨意的,否則,寫入內(nèi)存單元的值將會(huì)使得已存放的數(shù)據(jù)或程序丟失。應(yīng)使用編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)來實(shí)現(xiàn)地址分配。
ANSI標(biāo)準(zhǔn)建議設(shè)置了兩個(gè)最常用的動(dòng)態(tài)分配內(nèi)存的函數(shù)malloc()和free(),并包含在stdlib.h中,但有些C編譯卻使用malloc.h包含。使用時(shí)請(qǐng)參照具體的C編譯版本。
我們這里所指的動(dòng)態(tài)內(nèi)存分配其含義是指:當(dāng)定義指針變量時(shí),其變量的取值是隨機(jī)的,可能指向內(nèi)存的任一單元。若指針的指向是不安全的內(nèi)存地址,在該地址空間上的數(shù)據(jù)交換就會(huì)產(chǎn)生意料不到的效果。為此,在程序的執(zhí)行過程中,要保證指針操作的安全性,就要為
指針變量分配安全地址。在程序執(zhí)行時(shí)為指針變量所做的地址分配就稱之為動(dòng)態(tài)內(nèi)存分配。
當(dāng)無需指針變量操作時(shí),可以將其所分配的內(nèi)存歸還系統(tǒng),此過程我們稱之為內(nèi)存單元的釋放。
malloc()用以向編譯系統(tǒng)申請(qǐng)分配內(nèi)存;free()用以在使用完畢釋放掉所占內(nèi)存。
[例6-21]兩個(gè)字符串的交換。
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
main()
{
char *ptr1,*ptr2,*temp;
ptr1=malloc(30);/*動(dòng)態(tài)為指針變量分配長(zhǎng)度為30字節(jié)的存儲(chǔ)空間*/
ptr2=malloc(20);
temp=malloc(30);
printf(“inputstr1:”);
gets(ptr1);/*輸入字符串*/
printf(“inputstr2:”);
gets(ptr2);
printf(“str1————str2n”);
printf(“%s…….%sn”,ptr1,ptr2);
strcpy(temp,ptr1);/*串復(fù)制*/
strcpy(ptr1,ptr2);
strcpy(ptr2,temp);
printf(“str1————str2n”);
printf(“%s…….%sn”,ptr1,ptr2);
free(ptr1);
free(ptr2);
}
為指針變量分配的存儲(chǔ)空間長(zhǎng)度取決于存放字符的多少。在上述的程序中,兩個(gè)串的交換可以通過標(biāo)準(zhǔn)函數(shù)strcpy()來完成,也可以通過串指針交換指向完成,用temp=ptr1;ptr1=ptr2;ptr2=temp;三條賦值語句實(shí)現(xiàn)。但是,利用指針交換指向,其物理意義與串通過函數(shù)進(jìn)行的復(fù)制完全不同。前者是存放串地址的指針變量數(shù)據(jù)交換,后者是串在內(nèi)存物理空間的數(shù)據(jù)交換。指針變量用完后,將指針變量所占的存儲(chǔ)空間釋放。
指針的地址分配
相關(guān)推薦
- 華納云香港高防服務(wù)器150G防御4.6折促銷,低至6888元/月,CN2大帶寬直連清洗,終身循環(huán)折扣
- RakSmart服務(wù)器成本優(yōu)化策略
- raksmart法蘭克福云服務(wù)器延遲高嗎?
- 自媒體人搭建直播服務(wù)器使用raksmart優(yōu)化技巧
- 華納云高防服務(wù)器3.6折起低至1188元/月,企業(yè)級(jí)真實(shí)防御20G`T級(jí),自營(yíng)機(jī)房一手服務(wù)器資源
- 選擇站群VPS時(shí)必須關(guān)注的六大核心需求
- RakSmart法蘭克福數(shù)據(jù)中心優(yōu)勢(shì)與適用場(chǎng)景
- 從入門到精通,一文搞懂vps云服務(wù)器配置怎么選擇!