2013-06-19 117 views
0
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;”从标志线不起作用,并且两次打印“是或不是”并且“吃或不吃两次”为什么?C malloc和免费函数的奇怪行为

+0

可能的重复[为什么我得到不同的结果,当我解除引用后解除引用?](http://stackoverflow.com/questions/1078677/why-do-i-get -different-results-when-i-de-reference-a-free-iting-it) –

回答

1

这是不确定的行为

free(str2); 

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

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

+0

是的正确答案谢谢 –

1

这并不奇怪的行为。完全免费从内存中删除参考。你基本上是与free(str2);更好地删除此变量是使用bzero(str2,80);从头文件string.h

+0

正确的答案也谢谢。 –

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); 

这将做到这一点最安全和最简单的方法:)