[英]Using realloc on a previously malloc-ed pointer causes segmentation fault
我對 C 有問題,此代碼拋出堆棧轉儲。 我不知道出了什么問題。
char *text;
text = (char *) malloc(sizeof (char));
int size = 1;
char c = 'a';
char *new;
while (1) {
c = getchar();
putchar(c);
if (c == 10) {
text[size - 1] = '\0';
break;
}
text[size - 1] = c;
size++;
new = (char *) realloc(text, size * sizeof (*new));
free(text);
text = new;
}
在您的代碼中,您將text
作為第一個參數傳遞給realloc()
,然后在不檢查失敗的情況下將其傳遞給free()
。 這就是導致這里出現問題的原因。
根據C11
,第 7.22.3.5 章
realloc
函數釋放ptr
指向的舊對象,並返回一個指向大小由 size 指定的新對象的指針。 [...] 如果不能為新對象分配內存,則舊對象不會被釋放並且其值不變。
所以,如果realloc()
成功,之后,調用
free(text);
調用未定義的行為。 您不再需要為text
而煩惱,刪除對free()
的調用。
相關, free()
,第 7.22.3.3 節
[...] 否則,如果參數與內存管理函數先前返回的指針不匹配,或者如果空間已通過調用
free
或realloc
釋放,則行為未定義。
TL;DR首先檢查realloc()
是否成功,如果成功,請勿觸摸text
,如果realloc()
失敗,則需要調用free(text);
您不應該釋放指針text
因為成功realloc()
釋放舊指針。
來自 C11 標准章節 7.22.3.5 realloc 函數:
realloc 函數釋放 ptr 指向的舊對象,並返回一個指向大小由 size 指定的新對象的指針。 新對象的內容應與釋放前的舊對象的內容相同,直到新舊大小中較小的一個。 新對象中超出舊對象大小的任何字節都具有不確定的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.