C/C++有关内存的思考题

2023-06-30   


void GetMemory(char *p)
  
   p = (char *)malloc(100);
  
   void Test(void)
  
   char *str = NULL;
   GetMemory(str);
   strcpy(str, “hello world”);
   printf(str);
  
   请问运行Test 函数会有什么样的结果?
   答:程序崩溃。
   因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。
   strcpy(str, “hello world”);将使程序崩溃。
   char *GetMemory(void)
  
   char p[] = “hello world”;
   return p;
  
   void Test(void)
  
   char *str = NULL;
   str = GetMemory();
   printf(str);
  
   请问运行Test 函数会有什么样的结果?
   答:可能是乱码。
   因为GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
   void GetMemory2(char **p, int num)
  
   *p = (char *)malloc(num);
  
   void Test(void)
  
   char *str = NULL;
   GetMemory(&str, 100);
   strcpy(str, “hello”);
   printf(str);
  
   请问运行Test 函数会有什么样的结果?
   答:(1)能够输出hello;(2)内存泄漏
   void Test(void)
  
   char *str = (char *) malloc(100);
   strcpy(str, “hello”);
   free(str);
   if(str != NULL)
  
   strcpy(str, “world”);
   printf(str);
  
  
   请问运行Test 函数会有什么样的结果?
   答:篡改动态内存区的内容,后果难以预料,非常危险。
   因为free(str);之后,str 成为野指针,if(str != NULL)语句不起作用。


相关内容:

  1. 什么是虚拟内存?虚拟内存有什么优势?
  2. 描述内存分配方式以及它们的区别
  3. 为什么会有内存对齐
  4. 一家外企的面试题目(C/C++面试题,C语言面试题)
  5. Oracle的内存结构(Memory structures)
  6. 一个C/C++编程面试题