簡體   English   中英

在先前 malloc 的指針上使用 realloc 會導致分段錯誤

[英]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 節

[...] 否則,如果參數與內存管理函數先前返回的指針不匹配,或者如果空間已通過調用freerealloc釋放,則行為未定義。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM