【問題一】: 在子函數中動态配置設定記憶體:p=(int*)malloc(a*sizeof(int)),這個函數的目的是傳回p:return(p)
我想問問,該在什麼地方進行free(p)呢?如果在子函數中的return前free是肯定不行的,在之後free?子函數的return之後,不就結束函數調用了嗎?那時候free還會被子函數執行嗎?
【解答一】:
呃,這個在所配置設定的記憶體不需要的時候free,因為你傳回的時候這段記憶體還需要使用,是以在目前函數中不free
【解答二】:
malloc是在堆上配置設定的空間 不會随函數結束而消失,自己申請的要自己釋放,這就是動态申請。還有不能釋放倆次free(p)後 一定要把p = NULL; 不然容易再釋放一次 那就會出異常了
【問題二】:
謝謝樓上諸位,我知道malloc是在堆上配置設定的記憶體,不會随函數調用結束而自動釋放,問題是如果在被調函數中釋放,釋放位置無非兩個:return前或return後,return前釋放是不可能了,不然我這函數白寫了,還沒傳遞給正主呢,自己先被幹掉了,return後更不可能了,函數見了return就結束了,後面再寫多少行都白寫
可也不能在主函數中釋放啊 我試了試,編譯器報錯說我釋放的東西是未定義的,這是意料之中的
咋辦呢?真是迷茫了
【解答】:
你傳給函數的時候,在函數體外傳的應該是雙指針,否則這塊記憶體是傳回不了的。或者用函數傳回值來傳遞動态記憶體
方法一:雙指針
void GetMemory(char ** p, int num)
{
*p = (char *)malloc(num*sizeof(char));
}
int main()
{
char *str = NULL;
GetMemory(&str,10);
strcpy(str, “hello”);
free(str);
return 0;
}
方法二:用return
char * GetMemory(int num)
{
char *p = (char *)malloc(num*sizeof(char));
return p;
}
int main()
{
char *str = NULL;
str = GetMemory(10);
strcpy(str, “hello”);
free(str);
return 0;
}