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

c语言函数中,结构体变量的地址可以返回,怎么普通变量的地址不能反回?这是为什么?... c语言函数中,结构体变量的地址可以返回,怎么普通变量的地址不能反回?这是为什么? 展开
 我来答
折心灬小轩
2013-06-05 · TA获得超过543个赞
知道小有建树答主
回答量:259
采纳率:0%
帮助的人:112万
展开全部
首先你要明确这样一个问题。
在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)
生命周期,指变量对程序可见的范围

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

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

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

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

好了,我的回答就是这样,希望可以帮助到你
更多追问追答
追问
你是不是搞错了啊,我怎么对不上号?
追答
没有搞错,你要是理解了我说的,C语言最难的地方你也就会了。
C最难的地方是什么,内存管理。
内存管理,管理什么。变量!!!
变量什么最重要?当然是属性,那么你要对变量进行研究,不了解他的属性是不可能研究明白的。
如果我说这些让你看了感觉很茫然,感觉我很2,那就没办法了,你不适合程序设计。
另外,如果你感觉楼下瞎说一大堆比我的说的好,那你就先别评最佳,让网友评评谁的好!
行了,我在总结一下我上述回答:
不能返回一个栈上变量!
小兆86
2013-06-05 · TA获得超过802个赞
知道小有建树答主
回答量:990
采纳率:25%
帮助的人:874万
展开全部
结构体本身就是一个特别的指针,也就是说例子1中的x和y都是ST类型的指针,他们只是存放了结构体的首地址,而普通变量就不是了,普通变量存放的就是变量本身的值。这么说的话,例子1中fun函数就是一个传址调用,而例子2却是传值调用。传值调用仅仅把数值传送给了x然后x=10又把x的值修改但是不影响a的数值,至于x变量的地址那就是个随机的内存地址,没有意义。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友cd3d6c4
2013-06-05 · TA获得超过315个赞
知道小有建树答主
回答量:262
采纳率:0%
帮助的人:280万
展开全部
地址可以返回,但是例二中函数中定义的x在函数结束时就释放消失了哦,于是返回的地址指向垃圾数据,没有疑问给分哦亲
更多追问追答
追问
那例一呢?什么情况,都是变量,结构体变量不能释放吗?
追答
例二中x是局部变量,生命期就在生他的函数中,你可以用全局变量就能实现,或者如果你会c++的引用。例1结构体生成的对象在return 0时释放
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式