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

时间:2013-06-19 14:24:14

标签: 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);

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

3 个答案:

答案 0 :(得分:1)

这是未定义的行为

free(str2);

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

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

答案 1 :(得分:1)

这不是奇怪的行为。 Free完全删除了内存中的引用。您实际上是使用free(str2);删除变量。最好使用标题string.h中的bzero(str2,80);

答案 2 :(得分:0)

比这更好的是简单地使用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);

这将是最安全和最简单的方式:)