(轉)指針的指針作用(申請空間)之一


    

指針的指針作用(申請空間)之一

            轉載地址:http://blog.csdn.net/hanchaoman/article/details/4137340

 

 

以下是經典程序(載自林銳的從c/c++高質量編程),講解的部分是我個人理解

void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);       //p是形參指向的地址
}
void main()
{
char *str=NULL;
GetMemory(str,100);                            //str是實參指向的地址,不能通過調用函數來申請內存
strcpy(str,"hello");
}

結構是編譯能通過,卻不能運行,爲什麼呢?

先說一下指針作爲函數參數的意義:當將指針作爲參數時,實參向形參傳遞的是地址,在函數執行過程中,既可以對該參數指針進行處理,也可以對該參數指針所指向的數據進行處理,(以上程序段來說就是可以對p或*p進行處理)。由於此時形參和實參都是指向同一個存儲單元,因此當形參指針所指向的數據改變時,實參指針所指向的數據也作相應的改變,因此這時的形參可以作爲輸出參數使用。

按照上面的說法,這個程序應該沒有問題的啊,實參str和形參p指向同一個存儲單元,給形參分配的內存單元應該也給實參分配了纔對啊,問題就是在這裏

實參和形參是指向同一個地址,它們只是指向相同,但它們自身的地址不是同時申請的,就是說p在申請內存時,str並不可以通過調用Getmemory同時申請內存,所以儘管str調用了GetMemory,但它仍然是個空指針,所以進行strcpy是就不能運行。

要使程序可以運行,只要小小的改動就行了(用指向指針的指針):

void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);       //此時*p就變成了是形參本身的地址
}
void main()
{
char *str=NULL;
GetMemory(&str,100);                            //&str是實參的地址,所以實參和形參之間就可以直接調用
strcpy(str,"hello");
free(str);  

程序就會如你所願,輸出hello了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章