使用free()时的分段错误

此代码导致分段错误:

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 

我无法找到错误。 可能是什么原因?

你在一块没有使用malloc方法分配的内存块上调用free

当你这样做时: p = a你将p分配给堆栈数组a使用的内存。 该内存未使用malloc分配,因此无法使用free释放。

此外,通过重新分配,您将无法跟踪最初使用malloc分配并分配给p ,从而导致内存泄漏。

这个:

 p = a; 

复制指针 ,而不是指向内存的内容。 p现在指向数组a的第一个元素。 因此,当你执行free(p) ,你试图释放一个非动态数组,这没有任何意义。 1

您应该调查strncpy()来复制字符串。


它还会导致内存泄漏。

char a[50]在堆栈上分配一个包含50个字符的数组。 因此,指向堆栈上的地址。

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字符串,你会收到一个错误。