此代码导致分段错误:
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 = 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字符串,你会收到一个错误。
以上就是c/c++开发分享使用free()时的分段错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560224.html