为什么C语言函数中可以返回局部变量而不能返回局部变量的指针?
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/06/03 07:03:19
为什么C语言函数中可以返回局部变量而不能返回局部变量的指针?
这个从函数调用是堆栈的变化说吧,函数调用的时候,系统会将函数的返回地址、参数压入系统栈中,然后跳转到函数的代码区开始执行你函数里面写的代码,这个时候,子函数才会去向系统申请堆空间存放你在这个函数中定义的变量,这些空间(变量)是有生命周期的,到这个子函数执行完毕,它的生命周期就结束了,申请的堆空间就会被释放,这个时候你指向它的指针当然是无效的;而可以返回局部变量的原因是,你子函数的返回值(子函数局部变量),会被当作父函数的局部变量处理,它在堆中可以存放至父函数执行完毕,所以它是有效的.
再问: 基本明白了,但是有一点,子函数的返回值可以当作父函数的局部变量?这是为什么?空间都释放了为什么还会返回?感觉这点不是很有说服力,继续请教您。
再答: int test(void); int main() { test(); //返回值被销毁 int i = test(); //返回值赋给了main函数的局部变量 return 0; } 子函数的返回值是属于子函数局部变量,生命周期也只到子函数结束,但一般在调用它的函数里会被直接使用或者定义变量来存储,所以也会被放入父函数的栈中,直到父函数执行完毕。 另:评论的那哥们说得对,静态分配的变量是在栈中的,动态分配的才在堆中,回答的时候疏忽了,但是是一样的道理,最后一句话参考了堆管理机制,在栈中是不对的。
再问: 基本明白了,但是有一点,子函数的返回值可以当作父函数的局部变量?这是为什么?空间都释放了为什么还会返回?感觉这点不是很有说服力,继续请教您。
再答: int test(void); int main() { test(); //返回值被销毁 int i = test(); //返回值赋给了main函数的局部变量 return 0; } 子函数的返回值是属于子函数局部变量,生命周期也只到子函数结束,但一般在调用它的函数里会被直接使用或者定义变量来存储,所以也会被放入父函数的栈中,直到父函数执行完毕。 另:评论的那哥们说得对,静态分配的变量是在栈中的,动态分配的才在堆中,回答的时候疏忽了,但是是一样的道理,最后一句话参考了堆管理机制,在栈中是不对的。
不能实现函数之间数据传递的是A. 全局变量 B. 局部变量 C. 函数接口 D. 函数返回值
当函数局部变量用static修饰时,函数的返回值有可能发生不可预测?
C语言中局部变量和全局变量的生存日期分别为什么
C语言求救:外部变量和函数体内的局部变量同名时,局部变量优先.举例解释下,谢ing
C 语言中全局变量、局部变量、函数参数个是在什么时候分配内存空间
局部变量
.以下错误的描述是( ).A.不同的函数中可以使用相同的变量名 B.形式参数是局部变量 C.一个函数内部
简述静态局部变量和自动变量的区别,并举例说明 C语言的
C语言,全局变量和局部变量有什么区别
关于c语言:请问这个开头为什么要用static定义静态局部变量?
11)下列说法中错误的是( ) A.在不同的函数中可以使用相同名字的变量 B.函数中的形参是局部变量 C.在一个
1、以下不正确的说法是( ).A)在不同函数中可以使用相同名字的变量 B)形式参数是局部变量