三段代码扒内存

30阅读 0评论2025-04-15 snow888
分类:C/C++

{BANNED}中国{BANNED}中国第一段代码:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void create_mem()
  5. {
  6.         char *s;
  7.         s = (char *)malloc(sizeof(char)*65535);
  8.         snprintf(s,65535,"%s","aaaaaaaaaaaaaaa");
  9.         free(s);
  10.         s=NULL;
  11. }

  12. int main ( void )
  13. {
  14.         int i = 0;

  15.         for ( i = 0 ; i <1000000 ; i++ )
  16.         {
  17.                 printf("== %d ==\n",i);
  18.                 create_mem();
  19.         }
  20.         return 0;
  21. }
程序运行一切正常,没有问题。

第二段代码:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void create_mem()
  5. {
  6.         char *s;
  7.         s = (char *)malloc(sizeof(char)*65535);
  8.         snprintf(s,65535,"%s","aaaaaaaaaaaaaaa");
  9. // free(s);
  10. // s=NULL;
  11. }

  12. int main ( void )
  13. {
  14.         int i = 0;

  15.         for ( i = 0 ; i <1000000 ; i++ )
  16.         {
  17.                 printf("== %d ==\n",i);
  18.                 create_mem();
  19.         }
  20.         return 0;
  21. }
c程序运行会 coredump 。

第三段代码:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void create_mem()
  5. {
  6.         char *s;
  7.         s = (char *)malloc(sizeof(char)*65535);
  8.         //snprintf(s,65535,"%s","aaaaaaaaaaaaaaa");
  9. // free(s);
  10. // s=NULL;
  11. }

  12. int main ( void )
  13. {
  14.         int i = 0;

  15.         for ( i = 0 ; i <1000000 ; i++ )
  16.         {
  17.                 printf("== %d ==\n",i);
  18.                 create_mem();
  19.         }
  20.         return 0;
  21. }
c程序运行看似正常,不会出现 coredump 。

结论:
1、使用 malloc 分配内存后,一定要使用 if ( s == NULL ) 来进行判断。
2、malloc 分配内存失败,不会引起程序的崩溃,但是如果不检查 malloc 函数分配内存的情况就直接使用,则很有可能会出现针对未知内存区域进行操作的情况,从而导致程序 coredump。
3、要建立良好的习惯,一旦某个被分配的内存不在需要使用的时候,一定要用 free 来释放这块内存,并且将 s 指向 NULL ,以避免不可预知的情况发生。
上一篇:【血的教训】购买硬盘踩坑记
下一篇:通过代码再探内存