作业帮 > 综合 > 作业

为什么C语言函数中可以返回局部变量而不能返回局部变量的指针?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/06/03 07:03:19
为什么C语言函数中可以返回局部变量而不能返回局部变量的指针?
这个从函数调用是堆栈的变化说吧,函数调用的时候,系统会将函数的返回地址、参数压入系统栈中,然后跳转到函数的代码区开始执行你函数里面写的代码,这个时候,子函数才会去向系统申请堆空间存放你在这个函数中定义的变量,这些空间(变量)是有生命周期的,到这个子函数执行完毕,它的生命周期就结束了,申请的堆空间就会被释放,这个时候你指向它的指针当然是无效的;而可以返回局部变量的原因是,你子函数的返回值(子函数局部变量),会被当作父函数的局部变量处理,它在堆中可以存放至父函数执行完毕,所以它是有效的.
再问: 基本明白了,但是有一点,子函数的返回值可以当作父函数的局部变量?这是为什么?空间都释放了为什么还会返回?感觉这点不是很有说服力,继续请教您。
再答: int test(void); int main() { test(); //返回值被销毁 int i = test(); //返回值赋给了main函数的局部变量 return 0; } 子函数的返回值是属于子函数局部变量,生命周期也只到子函数结束,但一般在调用它的函数里会被直接使用或者定义变量来存储,所以也会被放入父函数的栈中,直到父函数执行完毕。 另:评论的那哥们说得对,静态分配的变量是在栈中的,动态分配的才在堆中,回答的时候疏忽了,但是是一样的道理,最后一句话参考了堆管理机制,在栈中是不对的。