【问题标题】: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);
      

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

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 2011-01-21
        • 1970-01-01
        相关资源
        最近更新 更多