关闭

转载:C 指针传递变量为什么无法修改变量值

99人阅读 评论(0) 收藏 举报
分类:

今天在知乎看好一份非常好的指针的陷阱,做个搬运工:

题目要求就是给以下函数纠错:

void GetMemory( char*p )
{
  p = (char*) malloc( 100 );
}
void Test( void ) 
{
  char*str = NULL;
  GetMemory( str ); 
  strcpy( str, "hello world" );
  printf( str );
}
答案是这样的: 传入中GetMemory(char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完后的str仍然为NULL;

。我觉得有关指针的问题,其实最好的理解方式莫过于绘图。

从Test函数执行开始,str指向的是NULL


然后经过GetMemory函数以后,在这里发生了一次赋值,即 char *p = str;

所以,p指向了(str指向的NULL),于是就变为了如此


然而经过了GetMemory的malloc以后,p获得了一块新内存的地址,于是p的指向就变为了这样


那么,从这里可以看出来str与p就分道扬镳了,而str也还是指向NULL。

那么,如何修改呢?一个是C++的引用,另外一个就是二重指针,即把GetMemory变为 GetMemory(char ** p) 来保存str的地址。



作者:蓝色
链接:https://www.zhihu.com/question/41476387/answer/91566794
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


https://www.zhihu.com/question/41476387



0
0
查看评论

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

最近看面试题,遇到一些关于通过函数改变一个变量的值得问题,现在终结一下: 先看下面一段代码: #include #include void GetMemory(char *p) { p=(char*)malloc(100); } void Test(void) { char *...
  • c12345423
  • c12345423
  • 2016-12-21 10:02
  • 1516

C语言通过指针修改变量的值

C语言学习笔记之通过指针修改变量的值 1.C语言的基本结构介绍 2.C语言的数据类型 3.通过指针改变变量的值 总结:
  • u012037685
  • u012037685
  • 2016-08-06 14:01
  • 2177

BAT命令替换变量中的值为新值

Windows中的日期格式,如果是在10点以前的时间,显示为“ 9”,而不是“09”,这就有可能在创建文件夹或文件的时候出错,因为获取到的时间会有空格。 set datetime=%date:~6,4%%date:~0,2%%date:~3,2%%time:~0,2%%time:~3,2%%tim...
  • songjiaping
  • songjiaping
  • 2017-07-05 09:41
  • 546

gdb调试过程中修改变量的值

转自:http://blog.csdn.net/haoel/article/details/2885 改变程序的执行 ———————     一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路...
  • yasi_xi
  • yasi_xi
  • 2013-10-16 18:31
  • 25422

解决Eclipse调试JDK源码无法查看变量值

解决Eclipse调试JDK源码无法查看变量值
  • u010407050
  • u010407050
  • 2017-08-04 17:08
  • 590

MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>

MDK/Keil 中,J-Link调试查看变量值总是显示<not in scope>的原因分析和解决办法
  • GMPY_Tiger
  • GMPY_Tiger
  • 2015-12-24 17:12
  • 3808

vs2012 调试时看不到变量的内容

vs2012 调试时看不到变量的内容 在工程上右键,打开属性页,配置属性——C/C++——优化,将优化改为“已禁用/Od”,再试试,你可能会有意想不到的惊喜~
  • dongzhe8
  • dongzhe8
  • 2016-07-13 14:09
  • 4149

vs2008编辑框无法添加变量,急~

我在vs2008建了一个基于单文档的程序,现在想添加一个dialog,在单文档启动之前启动这个dialog。在dialog里面添加了编辑框,可是这个编辑框不能添加变量,添加变量的那个选项是灰色的。可是在程序自己生成的那个about的dialog里面就能给控件添加变量。这是怎么回事?还请各位多多指教~
  • saoe3037
  • saoe3037
  • 2017-01-18 22:13
  • 138

linux sed 替换 变量

job_id = 10 我想替换JOB_ID_DEFAULT为10 开始写法 sed 's/JOB_ID_DEFAULT/${job_id}/' test > test.ctl 不行, 后来发现外层改成双引号就可以了 sed "s/JOB_ID_...
  • zxx2403
  • zxx2403
  • 2012-02-09 14:01
  • 3227

使用 firefox 运行时更改 javascript 变量值

一、 背景            某些学习网站,使用 javascript 脚本判断用户在一段时间是否操作页面,来判断用户是否在观看视频。            为突破该限制,...
  • shida_csdn
  • shida_csdn
  • 2018-01-05 16:34
  • 125
    个人资料
    • 访问:1161次
    • 积分:49
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:7篇
    • 译文:0篇
    • 评论:0条