天天看點

求教關于被調函數中的malloc與free

【問題一】: 在子函數中動态配置設定記憶體: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;

}

繼續閱讀