Chinaunix首页 | 论坛 | 博客
  • 博客访问: 813719
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: C/C++

2011-12-19 15:46:11

 

以下例子都在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:会有乱码)

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

图片MM2011-12-30 22:21:48

jonasmao: 不好意思,前几天出了点问题,你指的程序运行空间能说具体点,或者你可以就一个程序来说.....
就是程序运行时在内存中的输入输出结果信息,一般在关闭的同时都不存在了,我想保存一下啊~

jonasmao2011-12-27 16:19:32

图片MM: 能直接提取程序运行空间的数据么?how?.....
不好意思,前几天出了点问题,你指的程序运行空间能说具体点,或者你可以就一个程序来说

jonasmao2011-12-27 16:19:26

图片MM: 能直接提取程序运行空间的数据么?how?.....
不好意思,前几天出了点问题,你指的程序运行空间能说具体点,或者你可以就一个程序来说

图片MM2011-12-20 05:04:46

能直接提取程序运行空间的数据么?how?