Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67363
  • 博文数量: 27
  • 博客积分: 96
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-04 02:05
文章分类
文章存档

2012年(13)

2011年(14)

我的朋友

分类:

2011-12-20 05:03:46

 

以下例子都在GCC下make 了一把,符合程序后面的解答:

  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, "hello world");
  10. printf(str);
  11. }

请问运行Test函数会有什么样的结果?
答:程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。

 

  1. char *GetMemory(void)
  2. {
  3. char p[] = "hello world";
  4. return p;
  5. }
  6. void Test(void)
  7. {
  8. char *str = NULL;
  9. str = GetMemory();
  10. printf(str);
  11. }


请问运行Test函数会有什么样的结果?
答:可能是乱码。(ps:这里可能和编译器有关,试过自己的机子上GCC是NULL的)
因为GetMemory返回的是指向"栈内存"的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

 

  1. void GetMemory2(char **p, int num)
  2. {
  3. *p = (char *)malloc(num);
  4. }
  5. void Test(void)
  6. {
  7. char *str = NULL;
  8. GetMemory(&str, 100);
  9. strcpy(str, "hello");
  10. printf(str);
  11. }

 

请问运行Test函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏,因为strcpy遇到'\0'停止,此时str所指的堆空间中hello后面的内存并不是'\0',所以printf会出现内存泄露 (ps: 在自己机子上编译运行没有出现,可能编译器做了优化 ?)
 

  1. void Test(void)
  2. {
  3. char *str = (char *) malloc(100);
  4. strcpy(str, "hello");
  5. free(str);
  6. if(str != NULL)
  7. {
  8. strcpy(str, "world");
  9. printf(str);
  10. }
  11. }


请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用。(ps:会有乱码)

阅读(601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~