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/