几个常见的有关内存操作【摘至一些笔试题】

1776阅读 4评论2011-12-19 jonas_mao
分类:C/C++

 

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

上一篇:认识 Big-endian and Little-endian
下一篇:BGP中采用静态配置邻居的好处

文章评论