微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 内存管理实例中运行Test函数会有什么样的结果

内存管理实例中运行Test函数会有什么样的结果

时间:10-02 整理:3721RD 点击:

  1. void GetMemory(char *p)
  2. {
  3.     p = (char*)malloc(100);
  4. }

  5. void Test(void)
  6. {
  7.     char *str = NULL;
  8.     GetMemory(str);
  9.     strcpy(str, "helloworld");
  10.     printf(str);
  11. }

  12. 运行Test函数会有什么样的结果?
  13. 答:
  14.     程序崩溃;原因:1、实参是通过拷贝的方式
  15.     传递给行参的;str本身的值依旧是存放
  16.     了NULL的地址(程序头的空白地址);
  17.     2、malloc之后没有释放内存;

  18. char *GetMemory(void)
  19. {
  20.     char p[] = "hello world";
  21.     return p;
  22. }

  23. void Test(void)
  24. {
  25.     char *str = NULL;
  26.     str = GetMemory();
  27.     printf(str);
  28. }
  29. 运行Test函数会有什么样的结果?
  30. 答:打印乱码,原因:1、p字符串数组的空间是在栈上
  31.     开辟的,函数执行完之后,该空间释放了;
  32.     str指向了“栈内存”,不是NULL,但数据不存在了;
  33.     第23行,与char*  p = "hello world";
  34.     有本质的不同;(此处,p指向静态数据区,函数
  35.     中这样做没有问题)
  36.     2、printf访问栈内存,很可能存的是垃圾值。

  37. void  GetMemory(char **p, int num)
  38. {
  39.     *p = (char*)malloc(num);
  40. }

  41. void Test(void)
  42. {
  43.     char *str = NULL;
  44.     GetMemory(&str, 100);
  45.     strcpy(str, "hello");
  46.     printf(str);
  47. }


  48. 运行Test函数会有什么样的结果?
  49. 答:能正常输出,但是malloc没有free,内存泄露;
  50.     注意:值传递(任何时候,参数传递都是拷贝形式);
  51. void Test(void)
  52. {
  53.     char* str = (char*)malloc(100);
  54.     strcpy(str, "hello");
  55.     free(str);
  56.     if(str!=NULL)
  57.     {
  58.         strcpy(str, "world");
  59.         printf(str);
  60.     }
  61. }
  62. 运行Test函数会有什么样的结果?
  63. 答:篡改动态内存区的内容。后果难以确定;
  64.     因为free(str)之后,str成为野指针;
  65.      str仍有指向原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。
  66.     因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。
  67.   if(str!=NULL)语句不起作用;

复制代码



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top