C语言中,如何通过函数来改变一个变量的值

最近看面试题,遇到一些关于通过函数改变一个变量的值得问题,现在终结一下:

先看下面一段代码:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. void GetMemory(char *p)  
  5. {  
  6.     p=(char*)malloc(100);  
  7. }  
  8.   
  9. void Test(void)  
  10. {  
  11.     char *str=NULL;  
  12.     GetMemory(str);  
  13.     strcpy(str,"hello world"); 
  14. printf("%s\n",str);  

运行结果:段错误 

错误原因分析:str 是一个指针变量,传入GetMemory(str);的只是str的一个拷贝,所以str 的值没有改变,一直是NULL。而调用strcpy() 后,访问了非法的内存,所以产生段错误。

注意:由于GetMemory();中动态申请的内存没有释放,所以会造成内存泄漏 

解决办法如下:

使用二级指针

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. void GetMemory(char **p)  
  5. {  
  6.     *p=(char*)malloc(num);  
  7. }  
  8.   
  9. void Test(void)  
  10. {  
  11.     char  *str=NULL;  
  12.     GetMemory(&str);  
  13.     strcpy(str,"hello world");  
  14.     printf("%s\n",str);  
  15. }  

分析:由于传入的是一个指向 指针(str)的指针,也就是二级指针,所以可以通过这个二级指针来改变str (指针变量)的值,所以str的值会被改变。 

缺点:用完没有及时释放内存,会造成内存泄漏。

总结:

1. 形参只是外部一个变量的拷贝,而且是单向传递的,改变形参不会对实参造成影响。

2. 要想通过函数改变一个变量的值,需要通过指针来完成,比如:改变一个int 型变量的值,需要传入的形参为指向int 变量的指针。要改变一个一级指针的指向(指针变量的值),需要传入的形参为二级指针。因为指针本身也可以是个变量。

永不止步步 发表于03-30 11:05 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308467个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号