[英]How do I free a pointer returned from a function?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* f(void) {
char *x;
x = malloc(sizeof(char) * 4);
strcpy(x, "abc");
return(x);
}
int main(void) {
char *a;
a = f();
printf("%s", a);
free(a);
return(0);
}
是否必須釋放函數中的變量x
? 如果是這樣,當我需要退貨時,這怎么可能呢?
是否必須釋放函數中的變量x?
是的(有點,見我后來的評論)。 每次調用malloc
需要稍后調用free
。 否則,你有泄漏。 但請記住; 你是不是“自由[和] x
”,你在釋放該X指的是內存。
當您返回x
的值 (地址)的副本x
且已返回給調用者。 聲明了x
具有自動存儲持續時間。 它所指的內存必須被釋放。
如果是這樣,當我需要返回時,這怎么可能。
您的設計將責任放在呼叫者身上以釋放記憶。 你已經完成了這個。 當然,使用此方法需要您記錄該函數,以便代碼的用戶知道他們正在接收動態分配的內存地址。
更好的方法(IMO)是將緩沖區作為輸入參數。 現在很清楚誰負責管理這個內存(即調用者)。 也許我甚至不想動態分配它。 有了這個設計,這是我的選擇。
void f(char *buf, size_t buf_size) {
strncpy(buf, "abc", buf_size - 1);
buf[buf_size-1] = '\0';
}
另外,您應該始終檢查malloc
的返回值。 它可能會失敗,在這種情況下將返回空指針。 此外, sizeof(char)
保證標准為1
,因此您可以刪除該位並只說malloc(n)
。
是的,應該由呼叫者釋放。 比如你的主要free
。
在函數f
返回x
時,地址的副本將傳遞回調用者。 呼叫者可以在該地址free
撥打電話。
是的,你需要自由,但是當你自由時它已經被釋放了free(a);
在main
(因為a
在行a = f();
被指定為等於x
)。
退出函數后, x
被銷毀。 x
的值是指向動態分配的對象的地址。 退出函數后,該對象仍然存在。
要釋放動態對象,必須將f
函數返回的x
值傳遞給free
函數。
當你調用malloc
它會分配內存並返回該內存塊的初始地址。
在您的情況下,您將此地址返回給被調用者,現在被調用者main負責解除分配。
解除內存塊所需的唯一內容是初始地址,AFIK負責分配/釋放內存,它使用相當復雜的算法,但程序只需要跟蹤初始內存地址。 這個地址可以像任何其他整數值一樣存儲或移動,因為在32位系統中,它只是一個int值。
你編寫的代碼運行良好,你釋放a
由f進行malloced的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.