1. 程式人生 > 其它 >區域性變數中返回指標注意事項

區域性變數中返回指標注意事項

技術標籤: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棧中,系統自動釋放,,所以對應地址已經不存在資料了。