【问题标题】:C malloc and free functions's strange behaviourC malloc 和 free 函数的奇怪行为
【发布时间】:2013-06-16 03:23:37
【问题描述】:
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;”从标记的行它不起作用并打印“成为或不成为”两次以及“吃或不吃两次”这是为什么?
【问题讨论】:
标签:
c
string
memory
malloc
free
【解决方案1】:
这是未定义的行为
free(str2);
释放堆指针指向的内存并使指针无效。因为使用该指针并访问该内存可以产生任何结果。
话虽如此,看起来在您的实现中内存仍然可以访问,因此后续的strcat() 调用只是将新字符串附加到原始的两个字符串。因此,您在缓冲区中有两次To be or not to be,并且两次附加了To eat or to eat,因此您会看到问题中描述的结果。您不应依赖此行为 - 在其他情况下,您可能会产生任何其他结果,包括但不限于内存损坏、程序终止等。
【解决方案2】:
这不是奇怪的行为。 Free 完全从内存中删除引用。您实际上是在删除带有 free(str2); 的变量,更好的是使用标题 string.h 中的 bzero(str2,80);
【解决方案3】:
比这更好的是简单地使用 strcpy 和 strcat,如下所示:
char str1[]= "To be or not to be";
char str3[]= "To eat or to eat";
char * str2=(char*)malloc(80);
//char str3[40];
/* copy to sized buffer (overflow safe): */
strcpy(str2, str1);
strcat(str2, str1);
strcpy(str2, str3);
strcat(str2, str3);
这将是最安全和最简单的方法:)