區域性變數中返回指標注意事項
阿新 • • 發佈:2021-01-27
技術標籤:c
區域性變數中返回指標注意事項
1.簡介
陣列返回和malloc的指標返回不一樣,首先,區域性陣列是儲存在stack的棧中, 當函式執行結束之後,區域性變數的陣列就會被系統自動釋放;其次,區域性指標的malloc地址記憶體是儲存在heap的堆中,就算是函式執行結束之後,malloc地址也不能自動釋放,只能手動釋放!
2.程式對比
//save ret in heap, need ourself free
char *mallocReturn(char* str, char str2[])
{
#define MAX_LEN 50
char *ret = (char*)malloc (sizeof(char) * MAX_LEN);
memset(ret, 0, MAX_LEN);
sprintf(ret, "%s+%s", str, str2);
return ret;
}
//save ret[50] in stack, system free
char *arrayReturn(char* str, char str2[])
{
#define MAX_LEN 50
char ret[MAX_LEN];
memset(ret, 0, MAX_LEN);
sprintf(ret, "%s+%s", str, str2);
return ret;
}
int main(void)
{
printf("=============%s-%s===========\r\n", __DATE__, __TIME__);
char *rev = mallocReturn("1234,", "789");
printf("malloc:%s\n", rev);
//free(rev);
rev = arrayReturn("1234,", "789");
printf ("array:%s\n", rev);
printf("\r\n============================================\r\n");
return 0;
}
3.程式執行截圖
4.結論
使用malloc申請的記憶體,有正確的列印,表示處於這個地址的內容在mallocReturn函式執行之後,此地址沒有被釋放,因為此地址儲存在HEAP堆中,所以說需要自己的手動釋放,可以一直儲存;另外就是使用陣列申請的記憶體,沒有正確的列印,表示當arrayReturn執行之後,此地址已經被釋放掉了,因為此地址儲存在Stack棧中,系統自動釋放,,所以對應地址已經不存在資料了。