1. #include<stdio.h>  
  2. #include <iostream>  
  3. using namespace std;   
  4. void GetMemory1(char *p)    
  5. {    
  6.     p = (char *)malloc(100);    
  7. }    
  8. void Test1(void)    
  9. {    
  10.     char *str = NULL;    
  11.     GetMemory1(str);     
  12.     strcpy(str, "hello world"); //报内存错误,此时str仍然是空  
  13.     printf(str);    
  14. }    
  15.  
  16. void GetMemory2(char **p, int num)//用二重指针是正确的    
  17. {    
  18.     *p = (char *)malloc(num);    
  19. }    
  20. void Test2(void)    
  21. {    
  22.     char *str = NULL;    
  23.     GetMemory2(&str, 100);    
  24.     strcpy(str, "hello");      
  25.     printf(str);//输出hello但是有内存泄漏       
  26. }    
  27.  
  28. char *GetMemory3(void)    
  29. {      
  30.     char p[] = "hello world";  //p[]存在于栈里边.函数结束后释放  
  31.     return p;  
  32. }    
  33. void Test3(void)    
  34. {    
  35.     char *str = NULL;    
  36.     str = GetMemory3();    
  37.     printf(str); //输出不可预测,因为GetMemory 返回的是指向“栈内存”的指针,  
  38.                  //该指针的地址不是 NULL ,但其原现的内容已经被清除,新内容不可知。    
  39. }    
  40.  
  41. char *GetMemory4(void)    
  42. {      
  43.     char *p = "hello world";  //存放在字符串常量区,程序结束后才释放  
  44.     return p;  
  45. }    
  46. void Test4(void)    
  47. {    
  48.     char *str = NULL;    
  49.     str = GetMemory4();    
  50.     printf(str); //输出hello world    
  51. }    
  52.  
  53. void Test5(void)    
  54. {    
  55.     char *str = (char *) malloc(100);    
  56.     strcpy(str, "hello");    
  57.     free(str);    
  58.     if(str != NULL)    
  59.     {    
  60.         strcpy(str, "world");    
  61.         printf(str);  //输出world。free后成了野指针  
  62.     }    
  63. }   
  64.  
  65. void main()  
  66. {  
  67.     Test5();  

Test5为什么输出world不是很明白。

以上的程序涉及到C++中变量的存储位置和有效期

1、栈区:由系统进行内存管理,用于存储函数的参数值、局部变量,函数结束后释放。

2、堆区:由程序员分配和释放,new、malloc

3、全局区、静态区:存放全局变量和静态变量。

4、字符串常量区:用于存放字符串常量,程序结束后由系统释放。