C语言 被调用函数里栈区分配的内存,主调用函数是不能使用的
fun1()和fun2能返回成功,但是fun3不能返回成功老师说是因为"被调用函数里栈区分配的内存,主调用函数是不能使用的"那么我花了内存模型图a不是也在栈区上分配的内存...
fun1()和fun2能返回成功,但是fun3不能返回成功
老师说是因为"被调用函数里栈区分配的内存,主调用函数是不能使用的"
那么我花了内存模型图
a不是也在栈区上分配的内存吗?为什么a就可以返回出来,而str却不行
求大神解惑。。 展开
老师说是因为"被调用函数里栈区分配的内存,主调用函数是不能使用的"
那么我花了内存模型图
a不是也在栈区上分配的内存吗?为什么a就可以返回出来,而str却不行
求大神解惑。。 展开
4个回答
展开全部
我是这么理解的,函数调用返回值也会根据类型分配一段内存空间,fun1的返回值类型是int型,程序会分配4个字节用于保存int型的返回值,而a是个整形,它的值在内存释放前赋值拷贝给了返回区空间。
fun2和fun3的返回值类型是char *,程序会分配4个字节的内存空间保存返回值,这个值存储的是一个地址,而 p = “abcde”指向的是常量区,在函数调用结束前将p指向的地址(假如是0X00000111)拷贝给了返回值区间,函数调用结束后虽然释放了局部变量p所占的空间,但函数返回值空间保存的是拷贝过来的地址(依然是0X00000111),而这个地址所指向的内存区并没有释放,所有p可以看到指向的是"abcde"
而fun3拷贝的是局部变量str所存储的地址(假如是0x00002222),函数调用结束时会释放局部变量str的分配的内存,这个时候0x00002222所指向的内容就不确定了,因为它被回收了...所有如果调用fun3,它的返回值是不确定的
fun2和fun3的返回值类型是char *,程序会分配4个字节的内存空间保存返回值,这个值存储的是一个地址,而 p = “abcde”指向的是常量区,在函数调用结束前将p指向的地址(假如是0X00000111)拷贝给了返回值区间,函数调用结束后虽然释放了局部变量p所占的空间,但函数返回值空间保存的是拷贝过来的地址(依然是0X00000111),而这个地址所指向的内存区并没有释放,所有p可以看到指向的是"abcde"
而fun3拷贝的是局部变量str所存储的地址(假如是0x00002222),函数调用结束时会释放局部变量str的分配的内存,这个时候0x00002222所指向的内容就不确定了,因为它被回收了...所有如果调用fun3,它的返回值是不确定的
展开全部
fun2.首先字符串“char*p表示被调函数在栈区分配一个字节的内存,p中的内容是常量区字符串“abcde”的首地址,函数二调用结束时栈区被回收,而p作为返回值保存下来,常量区的“abcde”也没有受到影响,所以可以在主函数中使用。
fun3.中char str[]的含义是被调函数在栈区分配6个字节内存,然后把常量区的“abcde”拷贝到栈区分配的内存中,此时的str指向的是栈区中的“abcde”的首地址,而不是常量区中“abcde”的首地址,所以在调用结束时(当在主函数中调用其他函数时意味着前一个调用的函数栈区回收VS2013),str作为返回值被保存下来,而str所指向的内存空间已经被回收掉了。此时在主函数中用str[i]就不可能输出得到想要的结果了。
这也正是数组名指针与普通指针的一个区别。(还有一个区别就是数组名指针是常量指针不能改变指向)
fun3.中char str[]的含义是被调函数在栈区分配6个字节内存,然后把常量区的“abcde”拷贝到栈区分配的内存中,此时的str指向的是栈区中的“abcde”的首地址,而不是常量区中“abcde”的首地址,所以在调用结束时(当在主函数中调用其他函数时意味着前一个调用的函数栈区回收VS2013),str作为返回值被保存下来,而str所指向的内存空间已经被回收掉了。此时在主函数中用str[i]就不可能输出得到想要的结果了。
这也正是数组名指针与普通指针的一个区别。(还有一个区别就是数组名指针是常量指针不能改变指向)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
非指针和地址操作的函数参数和返值,都是赋值操作,而不是地址操作。
fun1出来后,变量a是无效了,但返值相当于一个被a赋值的临时变量,而不是返回了a的地址。
fun1出来后,变量a是无效了,但返值相当于一个被a赋值的临时变量,而不是返回了a的地址。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a是常量 你ruturn str是指针地址 而这个地址在跳出这个函数时就已经被free了 局部变量只能在函数里使用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询