c语言问题 为什么选D

如题所述

你可以加个断点调试一下,跟踪一下s的地址,经过malloc语句后s的地址就改变了,也就是malloc给s重新分配了地址,此时的s就相当于一个形参了,再对其进行赋值则只是为新申请的地址赋值,并不会改变主函数中s所指向的地址。 关键你要理解好函数作用域和指针的释放条件,仔细想想你就明白了。 顺便说一下,这个是内存管理那一块的典型题,自习研究一下会很有帮助的,他与以往的传引用非常的相像,所以容易搞混。跟malloc这个函数有直接的关系。追问

太给力了,你的回答完美解决了我的问题!

追答

谢谢,很高兴帮上你的忙

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-14
你记住:要使用函数操作其他变量的值时,有两种方式:传一个地址,或者使用引用。
上题就是考你这个。
所以要修改S的值,就有多种方式;
1.需要给函数加一个返回值,把S的值返回。在主函数中S = fun(。。。);
2.或者修改函数定义, fun(int*,int* ,int & S),在C++中才可以用引用。
3.或者调用函数时,fun(a, b, &s);
这样就能达到函数的功能了。本回答被网友采纳
第2个回答  2013-09-14
函数fun的形式参数s只从被调用处得到一个拷贝,函数中对拷贝的任何操作都不会影响原来的变量值。而且,你这里在fun中没有用传过去的值,而是为s重新分配内存,与传来的值都八杆子打不着,更不要说与主函数中的s有什么联系了。所以主函数中的s的值一直是a,故输出*s就是输出*a,自然是1了……
第3个回答  2013-09-14
S在main中的值是1,在fun中修改为11,但没有把值返回。
在fun中修改了s地址,但fun结束后,s指向的内存变回了a的内存,所以*s=a[0]=1;
你可以把malloc那句注释掉,你就发现s的值就是11了;
第4个回答  2013-09-14
fun()函数里面。s=(int *)malloc(sizeof(int));语句重新分配了地址,而实参int *s未传入,形参s被重新定义了,即原来a[2]中内容未被改变,故为1。
去掉s=(int *)malloc(sizeof(int));就为11了。
第5个回答  2013-09-14
这个,正确答案就是他啊