簡體   English   中英

使用free()時的分段錯誤

[英]segmentation fault when free() is used

此代碼導致分段錯誤:

int main(){

    char *p;
    char a[50] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    p = (char *)malloc(50*sizeof(char));

    if(!p){
            cout << "Allocation Failure";
            cout << "\n";
    }
    else{
            cout << "Allocation Success";
            cout << "\n";
            p = a;
            cout << p;
            cout << "\n";
            free(p);
    }

    return 0;
}

執行該程序后的輸出是:

Allocation Success

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Segmentation fault

我無法找到錯誤。 可能是什么原因?

這個:

p = a;

復制指針 ,而不是指向內存的內容。 p現在指向數組a的第一個元素。 因此,當你執行free(p) ,你試圖釋放一個非動態數組,這沒有任何意義。 1

您應該調查strncpy()來復制字符串。


它還會導致內存泄漏。

你在一塊沒有使用malloc方法分配的內存塊上調用free

當你這樣做: p = a你分配給p由堆疊陣列使用的內存a 該內存未使用malloc分配,因此無法使用free釋放。

此外,通過重新分配,您將無法跟蹤最初使用malloc分配並分配給p ,從而導致內存泄漏。

char a[50]在堆棧上分配一個包含50個字符的數組。 a因此指向堆棧上的地址。

p = ap設置為與a相同的地址。 因此,在p = a ,p指向堆棧上的地址。 請記住, p包含一個地址

之后, free(p)嘗試釋放堆棧上的內存區域,這是非法的。 你只能釋放你從malloc()獲得的內存。

你實際上是指memcpy(p,a,50); 不是p = a,記住C沒有字符串數據類型。

p = a; // p points a

執行這一行,p應該指向const string( char * )。 你不能free()通過調用malloccalloc無法獲得的任何東西。 因為在這個例子中你試圖free()一個const字符串,你會得到一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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