C malloc 和自由函数的奇怪行为

标签 c string memory malloc free

char str1[]= "To be or not to be";
char str3[]= "To eat or to eat";
char * str2=(char*)malloc(80);
//char str3[40];
str2[0]=NULL;
/* copy to sized buffer (overflow safe): */
strcat(str2, str1);
strcat(str2, str1);
free(str2);str2[0]=NULL;//<<==Marked line
strcat(str2, str3);
strcat(str2, str3);

在下面的代码中,如果我删除了“str2[0]=NULL;”,该操作可以正常打印“吃或不吃”2 次。从标记的行开始,它不起作用并打印“是或不是”两次以及“吃或不吃两次”这是为什么?

最佳答案

这是未定义的行为

free(str2);

释放堆指针指向的内存并使指针无效。因为使用该指针并访问该内存可以产生任何结果。

话虽如此,在您的实现中,内存似乎仍然可以访问,因此后续的 strcat() 调用只是将新字符串附加到原始的两个字符串。因此,您在缓冲区中有两次 To be or not to be 并且 To eat or to eat 附加了两次,因此您会看到问题中描述的结果。您不应依赖此行为 - 在其他情况下,您可能会得到任何其他结果,包括但不限于内存损坏、程序终止等。

关于C malloc 和自由函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17193845/

相关文章:

python - 在 C 扩展中使用 Python 列表

c - 使用指针手动复制字符串时出错

java - Java 的 equalsIgnoreCase 的正确替代方法是什么?

python - 在换行符处拆分字符串

c++ - 在 C++ 中,枚举数据类型占用多少内存?

memory - 我的 CUDA 纹理内存有多大?

c# - 从 c 到 c# 的 double 组编码

c# - 为什么没有本地字符串方法来更改字符串标题大小写?

java - 分析/追踪 JVM 中潜在的 native 内存泄漏

c - 错误条件 block 中的代码可能会出现段错误吗?