c/c++语言开发共享函数中使用的内存何时变为空闲?(C编程)

以下是代码

代码:

#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

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐