以下是代码
代码:
#include int * num(void); int main(void) { int * num2; num2 =num(); printf("%dn" , *num2); return 0; } int * num(void) { int num = 20; return # }
问题:
您可以看到变量值的原因是因为堆栈的工作原理。 在输入函数num
,有效地移动指针(堆栈指针)以为函数的本地存储添加空间。 退出函数时,堆栈指针会有效地向后移动,这意味着下一个函数调用将覆盖前一个函数调用中使用的堆栈存储。 然而,在被覆盖之前,价值存在于一种不确定的状态。 它实际上仍然在内存中,但可能随时被覆盖。 那里存在的实际价值可能是也可能不是。 这就是为什么像上面那样做被称为未定义的行为 。
基本上……不要这样做。
只是添加@Goz已经很好地解释的内容。 试试这段代码:
#include int * num(void); int fib(int n) { if( 0 == n || 1 == n ) return n; return fib(n-1) + fib(n-2); } int main(void) { int * num2; num2 =num(); (void)fib(7); printf("%dn" , *num2); return 0; } int * num(void) { int num = 20; return # }
很有可能你不会得到“20”作为输出(也有可能程序终止)同样,当你编译时,编译器会警告你这个“警告:函数返回局部变量的地址”: )
返回指向局部变量的指针是不对的。 当该函数返回时,变量num
被释放,并且C运行库可以将该内存地址用于另一个值。 返回的指针现在无效,因为它指向未分配的内存区域,并且如果使用则将调用未定义的行为。 未定义的行为意味着它可能会或可能不会执行您想要的操作。 在某些情况下,程序会崩溃,在其他情况下它可能会起作用。 为什么它在这种情况下有效是因为该部分内存仍将保持值20
。 在解除分配后,C运行时不会将该部分内存填充为0。
以上就是c/c++开发分享函数中使用的内存何时变为空闲?(C编程)相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560525.html