情形1

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void GetMemory(char *p)  

  5. {  

  6.    p=(char *)malloc(100);  

  7. }  

  8. void Test(void)  

  9. {  

  10. char *str=NULL;  

  11.    GetMemory(str);  

  12.    strcpy(str,"helloworld");  

  13.    printf("%s\n",str);  

  14. }  

  15. int main(void)  

  16. {    

  17.    Test();  

  18. return 0;  

  19. }

错误:
1. 调用GetMemory(str),属传值,str并未变化,仍为NULL
2. 调用strcpy,程序到这将产生错误,因为str并未指定某一内存。
3. malloc内存时可能会出错,需判断内存是否申请成功,加上:
   if(*p==NULL)
   {
       进行申请内存失败处理
   }
4. 动态创建的内存没释放
修改方法1:
   传址-----使用指向指针的指针

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void GetMemory(char **p)  

  5. {  

  6.    *p=(char *)malloc(100);  

  7. }  

  8. void Test(void)  

  9. {  

  10. char *str=NULL;  

  11.    GetMemory(&str);  

  12.    strcpy(str,"helloworld");  

  13.    printf("%s\n",str);  

  14. }  

  15. int main(void)  

  16. {    

  17.    Test();  

  18. return 0;  

  19. }

修改方法2:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. char* GetMemory()  

  5. {  

  6. char* p=(char *)malloc(100);  

  7. return p;  

  8. }  

  9. void Test(void)  

  10. {  

  11. char *str=NULL;  

  12.    str=GetMemory();  

  13.    strcpy(str,"helloworld");  

  14.    printf("%s\n",str);  

  15. }  

  16. int main(void)  

  17. {    

  18.    Test();  

  19. return 0;  

  20. }

情形2

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. char *GetMemory(void)  

  5. {  

  6. char p[]="hello world";  

  7. return p;  

  8. }  

  9. void Test(void)  

  10. {  

  11. char *str=NULL;  

  12.    str=GetMemory();  

  13.    printf("%s\n",str);  

  14. }  

  15. int main(void)  

  16. {    

  17.    Test();  

  18. return 0;  

  19. }

错误原因:
   函数GetMemory中数组p为局部变量,在函数返回后,内存已经被释放,生存期结束。

情形3

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void GetMemory(char **p,int num)  

  5. {  

  6.    *p=(char *)malloc(num);    

  7. }  

  8. void Test(void)  

  9. {  

  10. char *str=NULL;  

  11.    GetMemory(&str,100);  

  12.    strcpy(str,"helloworld");  

  13.    printf("%s\n",str);  

  14. }    

  15. int main(void)  

  16. {    

  17.    Test();  

  18. return 0;  

  19. }

可以打印出字符,但存在问题有:
   1. 函数GetMemory中,malloc内存后,未判断内存是否申请成功,应加上:
   if(*p==NULL)
   {
       //进行申请内存失败处理
   }
   2. 在Test函数中,未对malloc的内存进行释放。

情形4:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void Test(void)  

  5. {  

  6. char *str=(char*)malloc(100);  

  7.    strcpy(str,"helloworld");  

  8.    printf("%s\n",str);  

  9.    free(str);  

  10. }    

  11. int main(void)  

  12. {    

  13.    Test();  

  14. return 0;  

  15. }  

存在问题有:
   1. malloc内存后,未判断内存是否申请成功
   2. 在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str=NULL

情形5

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void Test(void)  

  5. {  

  6. char *str=(char*)malloc(100);  

  7.    strcpy(str,"hello");  

  8. //str+=6;

  9.    free(str);  

  10. if(str!=NULL)  

  11.    {  

  12.        strcpy(str,"world");  

  13.        printf(str);  

  14.    }  

  15. }    

  16. int main(void)  

  17. {    

  18.    Test();  

  19. return 0;  

  20. }

在vc中可以输出"world",但这是不确定的值,存在的问题有:
   申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题。到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值。所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在程序中当释放一个指针后,一定要人为的将指针付成NULL。这样就会避免出现"野"指针的出现。有人说"野"指针很可怕,会带来意想不到的错误。

情形6

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void swap(int *p1,int *p2)  

  5. {  

  6. int *p;  

  7.     *p=*p1;  

  8.     *p1=*p2;  

  9.     *p2=*p;  

  10. }    

  11. int main(void)  

  12. {    

  13. int a=3;  

  14. int b=5;  

  15.    swap(&a,&b);  

  16.    printf("a=%d,b=%d\n",a,b);  

  17. return 0;  

  18. }

   在swap函数中,p是一个“野”指针,未指向任何内存,所以当将值*p1赋给*p时,值*p1无处存放,会出错。有可能指向系统区,导致程序运行崩溃。
   可修改为:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. void swap(int *p1,int *p2)  

  5. {  

  6. int p;  

  7.     p=*p1;  

  8.     *p1=*p2;  

  9.     *p2=p;  

  10. }    

  11. int main(void)  

  12. {    

  13. int a=3;  

  14. int b=5;  

  15.    swap(&a,&b);  

  16.    printf("a=%d,b=%d\n",a,b);  

  17. return 0;  

  18. }