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;”从标记的行不起作用并打印“要或不要”两次以及“吃或不吃两次”为什么会这样?
答案 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);
这将是最安全和最简单的方式:)