c语言形参的地址可以作为返回值吗?

#include <stdio.h>

int *fun(int x)
{int *px;
x=100;px=&x;
return px;
}
main()
{int y, *p;
y=999;printf("%d\n",y);
p=fun(y); printf("%d",*p);
}
以上程序编译运行正确,结果是:
999
100
函数fun将形参x的地址返回给p,但是形参x的存储空间在函数结束后自动消散,为什么结果还是100?

应该说概念上就很有问题。
首先,当一个参数被传入时,除了引用和指针类型的参数,实际上传入的参数在其所在函数应该是一个值传入,其所在的存储空间跟原有的传入参数的变量的地址根本是两个地址,所以说其在其他函数中运行过程中所做的修改,对原始数据是没有影响的。
针对本例,你还可以试试,在
p=fun(y); printf("%d",*p);
后加入一个句子:
y = 20;
再调用printf("%d",*p);
结果应该仍然是100;
所以说形参的地址可以作为返回值的想法是错误的,而且是危险的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-23
因为还没有别的程序用到那段空间。因此返回值还正确。
如果用vs,在debug模式下,有可能返回奇怪的值。
vs好像有个设置,自动初始化不用的内存。
函数返回指针,一般都是在函数中分配的内存的指针,或者外部传入的地址空间内的指针。
第2个回答  2011-08-23
虽然形参被消散,但并没有其它的函数调用,所以没有覆盖原来的值,按地址取值,还是会取到原来的值。本回答被提问者采纳
相似回答