请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:

c语言函数中,结构体变量的地址可以返回,怎么普通变量的地址不能反回?这是为什么?

首先你要明确这样一个问题。
在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)
生命周期,指变量对程序可见的范围

作用域,指变量对程序可修改的范围
注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)
另外你应该知道,C语言函数只能按值传参,而且形参被分配在栈上

对于指针,同样是按值传参的,只不过对指针进行间接引用(解除指针运算)时,被访问的都是同一个地址罢了,所以指针是个不特例的特例

有了这些基础知识,我们可以来解决你的问题了
首先,你第一个例子里的程序在fun函数中定义了一个指针y,并使指针y指向了形参x,也就是说,y指向了实参(可以类比得出这个结论)..所以函数可以成功返回,因为y指向的是实参,实参在函数中有完全的生名周期和作用域(可见性和可修改性),所以可以返回,他返回的地址在栈上,不过却是实参的地址,所以有效
第二个例子中,你的指针p指向了一个栈上变量,这个栈上变量在函数返回时(return时)就已经变得无效,所以你的返回是一个无效的地址(即改地址没有完全的生命周期和作用域),所以出错

编程提示:不要返回声明在栈上的变量,如果一定要使用,可以使用动态内存

好了,我的回答就是这样,希望可以帮助到你追问

你是不是搞错了啊,我怎么对不上号?

追答

没有搞错,你要是理解了我说的,C语言最难的地方你也就会了。
C最难的地方是什么,内存管理。
内存管理,管理什么。变量!!!
变量什么最重要?当然是属性,那么你要对变量进行研究,不了解他的属性是不可能研究明白的。
如果我说这些让你看了感觉很茫然,感觉我很2,那就没办法了,你不适合程序设计。
另外,如果你感觉楼下瞎说一大堆比我的说的好,那你就先别评最佳,让网友评评谁的好!
行了,我在总结一下我上述回答:
不能返回一个栈上变量!

追问

千言万语只想说谢谢!再谢谢!
1、我在fun函数中只定义指针px,没有定义y,指针指向了形参。
2、y指向了实参,你是怎么类比得出这个结论的,y是怎么指向实参的。
我不能再追问了,超过次数了!麻烦你加一下我的QQ,我用百度hi网页版发给你了!
谢谢啦!

追答

我Q:779139218

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-05
结构体本身就是一个特别的指针,也就是说例子1中的x和y都是ST类型的指针,他们只是存放了结构体的首地址,而普通变量就不是了,普通变量存放的就是变量本身的值。这么说的话,例子1中fun函数就是一个传址调用,而例子2却是传值调用。传值调用仅仅把数值传送给了x然后x=10又把x的值修改但是不影响a的数值,至于x变量的地址那就是个随机的内存地址,没有意义。
第2个回答  2013-06-05
地址可以返回,但是例二中函数中定义的x在函数结束时就释放消失了哦,于是返回的地址指向垃圾数据,没有疑问给分哦亲追问

那例一呢?什么情况,都是变量,结构体变量不能释放吗?

追答

例二中x是局部变量,生命期就在生他的函数中,你可以用全局变量就能实现,或者如果你会c++的引用。例1结构体生成的对象在return 0时释放

追问

哪有return0啊?

追答

就是主函数结束时自动会调用啊,你也可以显式调用,在主函数最后加个return 0;

追问

谁规定结构体变量需要在return 0时才能释放啊,这到底是什么意思啊,你能从栈和堆的角度说说吗?

追答

也可以不用再结束时释放(动态结构体),只是,当你把它做为实参传递时候(在传递的时候结构体肯定还存在吧!)编译器是把结构体的地址传送给形参(相当于引用),于是接收结构的函数对结构体操作就是对时参的操作。你可以参考下c++里的引用这中东西。

相似回答