返回動(dòng)態(tài)內(nèi)存--malloc#include <stdio.h> #include <stdlib.h> void getmemory(char *p) { p=(char*)malloc(100); strcpy(p,"hello world"); } int main() { char *str = NULL; getmemory(str); prinrf("%s\n",str); free(str); return 0; } 此段代碼有錯(cuò),getmemory(str)中參數(shù)問(wèn)題。編譯器會(huì)為每個(gè)函數(shù)的參數(shù)都復(fù)制一份臨時(shí)副本,指針參數(shù) p 的副本在C中是_p,并且對(duì)_p賦值為p ,即 _p = p 。如果在getmemory函數(shù)體內(nèi)修改了 _p,則導(dǎo)致參數(shù) p 的內(nèi)容做相應(yīng)的修改。這就是指針可用作輸出參數(shù)的原因。 但此處中g(shù)etmemory 函數(shù)的 _p 申請(qǐng)了新內(nèi)存,此時(shí) _p 所指的內(nèi)存地址改變了,但是 p 沒(méi)變。所以每次調(diào)用getmemory都會(huì)造成內(nèi)存泄露。 形參p的域只在函數(shù)里有效,p一開(kāi)始指向你想要的地址,但是當(dāng)你重新分配內(nèi)存的時(shí)候p指向了新的地址,當(dāng)你返回函數(shù)的時(shí)候原來(lái)的地址還是空的。 正確代碼: #include <stdio.h> char * getmm(int mm) void getm(char **p,int mm) int main(void)
文章轉(zhuǎn)自:http://zeorro.blog.163.com/blog/static/18689205820122463927802/
|
|
來(lái)自: XX_YY_ZZ > 《重要關(guān)鍵字》