当前位置:  开发笔记 > 编程语言 > 正文

C中函数的局部变量范围

如何解决《C中函数的局部变量范围》经验,为你挑选了3个好方法。

当我开始用C语言编程时,我听说过以下场景.

" 尝试从外部访问,函数局部变量将导致错误(或垃圾值).因为当我们从函数返回时堆栈被清除 "

但我的下面的代码示例打印值为50.我正在使用最新的GCC编译器编译代码.

#include 

int * left();

int main()
{
      int *p=left();
      printf("%d\n",*p);
      return 0;
}

int * left()
{
        int i=50;
        return &i;
}

在这个问题上欢迎我.

我能知道C++中的行为吗?它类似于c ..



1> hackworks..:

变量'i'在堆栈上创建,当函数'left'返回时,堆栈被清除.当我说清除时,这意味着变量'i'使用的地址被标记为可以重复使用.直到其他部分代码使用相同的地址,该值将保持不变.在你的情况下,这是一个幸运的,给你想要的结果.如果你在打电话给'左'之后再调用几个函数,我相当肯定你会得到错误的结果.


在这种情况下,C++与C完全相同.*p值将是未定义的.

2> Josh Lee..:

修改它以添加第二次调用printf,您将看到第一次不同的值.在启用优化的情况下编译它,您将看到另一组值.做任何有价值的东西,你进入未定义的领域,这意味着编译器可以通过你的鼻段自由地召唤恶魔.

在我的系统上,我看到50然后0; 与优化我看0,然后32767.

如果你创建局部变量static,那么你可以返回它的地址,因为它变得像一个全局变量(但请记住它只有一个实例).

当一个函数返回时,它在堆栈上使用的本地存储现在被程序视为"未使用",因为堆栈不再那么高了.但通常情况下,值仍然存在,因为没有迫切需要清除它们.内存也仍然由程序拥有,因为将内存一次几个字节返回给操作系统是没有意义的.因此,对于您的具体示例,在您编译它的情况下,指向的内存仍包含该值50.但是,正式地说,它的价值*p不确定的,并且尝试使用它会导致未定义的行为.

C语言的一个存在性危机是,一方面,它没有说明堆栈和构成运行过程的各种十六进制污泥; 另一方面,有必要了解这些,以保护自己免受崩溃,缓冲区溢出和未定义的行为.请记住,你很幸运,GCC会对此发出警告.



3> JaredPar..:

根据C标准的行为是未定义的而不是垃圾值.因此,有可能,有时可能,价值将保持不变.无论如何都无法保证这一点.

这是运气/机会/事故,没有别的.不要依赖这种行为,因为它回来咬你.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有