C语言 被调用函数里栈区分配的内存,主调用函数是不能使用的

fun1()和fun2能返回成功,但是fun3不能返回成功老师说是因为"被调用函数里栈区分配的内存,主调用函数是不能使用的"那么我花了内存模型图a不是也在栈区上分配的内存... fun1()和fun2能返回成功,但是fun3不能返回成功
老师说是因为"被调用函数里栈区分配的内存,主调用函数是不能使用的"
那么我花了内存模型图

a不是也在栈区上分配的内存吗?为什么a就可以返回出来,而str却不行
求大神解惑。。
展开
 我来答
百度网友22ce421cf
2014-11-05 · TA获得超过118个赞
知道小有建树答主
回答量:185
采纳率:0%
帮助的人:142万
展开全部
我是这么理解的,函数调用返回值也会根据类型分配一段内存空间,fun1的返回值类型是int型,程序会分配4个字节用于保存int型的返回值,而a是个整形,它的值在内存释放前赋值拷贝给了返回区空间。

fun2和fun3的返回值类型是char *,程序会分配4个字节的内存空间保存返回值,这个值存储的是一个地址,而 p = “abcde”指向的是常量区,在函数调用结束前将p指向的地址(假如是0X00000111)拷贝给了返回值区间,函数调用结束后虽然释放了局部变量p所占的空间,但函数返回值空间保存的是拷贝过来的地址(依然是0X00000111),而这个地址所指向的内存区并没有释放,所有p可以看到指向的是"abcde"

而fun3拷贝的是局部变量str所存储的地址(假如是0x00002222),函数调用结束时会释放局部变量str的分配的内存,这个时候0x00002222所指向的内容就不确定了,因为它被回收了...所有如果调用fun3,它的返回值是不确定的
巴伐利亚巨人1
2019-06-04 · 超过19用户采纳过TA的回答
知道答主
回答量:33
采纳率:60%
帮助的人:9.4万
展开全部
fun2.首先字符串“char*p表示被调函数在栈区分配一个字节的内存,p中的内容是常量区字符串“abcde”的首地址,函数二调用结束时栈区被回收,而p作为返回值保存下来,常量区的“abcde”也没有受到影响,所以可以在主函数中使用。
fun3.中char str[]的含义是被调函数在栈区分配6个字节内存,然后把常量区的“abcde”拷贝到栈区分配的内存中,此时的str指向的是栈区中的“abcde”的首地址,而不是常量区中“abcde”的首地址,所以在调用结束时(当在主函数中调用其他函数时意味着前一个调用的函数栈区回收VS2013),str作为返回值被保存下来,而str所指向的内存空间已经被回收掉了。此时在主函数中用str[i]就不可能输出得到想要的结果了。
这也正是数组名指针与普通指针的一个区别。(还有一个区别就是数组名指针是常量指针不能改变指向)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bhtzu
推荐于2017-09-10 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4043万
展开全部
非指针和地址操作的函数参数和返值,都是赋值操作,而不是地址操作。
fun1出来后,变量a是无效了,但返值相当于一个被a赋值的临时变量,而不是返回了a的地址。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我透明_的
2014-11-05 · TA获得超过190个赞
知道小有建树答主
回答量:214
采纳率:0%
帮助的人:163万
展开全部
a是常量 你ruturn str是指针地址 而这个地址在跳出这个函数时就已经被free了 局部变量只能在函数里使用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式