此代码导致分段错误:
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
我无法找到错误。可能是什么原因?
答案 0 :(得分:12)
此:
p = a;
复制指针,而不是指向内存的内容。 p
现在指向数组a
的第一个元素。所以当你free(p)
时,你试图释放一个没有任何意义的非动态数组。 1
您应该调查strncpy()
来复制字符串。
<小时/> <子> 1。它还会导致内存泄漏。
答案 1 :(得分:10)
您正在使用free
方法之一未分配的内存块上调用malloc
。
执行:p = a
时,您将p
分配给堆栈数组a
使用的内存。该内存未使用malloc
分配,因此无法使用free
释放。
此外,通过重新分配,您将无法跟踪最初使用malloc
分配并分配给p
的块,从而导致内存泄漏。
答案 2 :(得分:0)
char a[50]
在堆栈上分配一个包含50个字符的数组。因此a
指向堆栈上的地址。
p = a
设置 p 指向与 a 相同的地址。因此,在p = a
之后,p指向堆栈上的地址。请记住, p 包含地址。
之后,free(p)
尝试释放堆栈上的内存区域,这是非法的。你只能释放你从malloc()获得的记忆。
答案 3 :(得分:0)
你实际上是指memcpy(p,a,50);不是p = a,记住C没有字符串数据类型。
答案 4 :(得分:0)
p = a; // p points a
执行此行,p应该指向const字符串(char *
)。
您无法通过调用free()
或malloc
来calloc
无法获得任何内容。因为在这个例子中你尝试free()
一个const字符串,你会收到一个错误。