[英]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 = a
將p設置為與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()
通過調用malloc
或calloc
無法獲得的任何東西。 因為在這個例子中你試圖free()
一個const字符串,你會得到一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.