&符号bug和c的生命周期

Rac*_*hit -4 c pointers local-variables compiler-warnings

众所周知,局部变量具有局部范围和寿命.请考虑以下代码:

      int* abc()
      {
            int m;
            return(&m);
       }
       void main()
       {
             int* p=abc();
             *p=32;
        }
Run Code Online (Sandbox Code Playgroud)

这给了我一个函数返回局部变量地址的警告.我认为这是理由:一旦abc()完成,就会释放本地可验证的m.所以我们在主函数中解除引用无效的内存位置.

但是,请考虑以下代码:

      int* abc()
      {
           int m;
           return(&m);
           int p=9;
       }
       void main()
       {
           int* p=abc();
           *p=32;
       }
Run Code Online (Sandbox Code Playgroud)

我在这里得到同样的警告.但我想m返回时仍会保留其生命周期.怎么了?请解释错误.我的理由是错的吗?

小智 10

首先,注意int p=9;永远不会达到,所以你的两个版本在功能上是相同的.程序将为内存分配内存m并返回该内存的地址; return语句下面的任何代码都是不可缓存的.

其次,m函数返回后,实际上并没有取消分配局部变量.相反,程序会考虑内存可用空间.该空间可能用于其他目的,或者它可能保持未使用状态并永远保持其旧值.因为您无法保证在abc()函数退出后内存会发生什么,所以您不应尝试以任何方式访问或修改它.

  • 欢迎来到Stack Overflow,感谢您发布如此详尽且解释清楚的答案! (3认同)

zah*_*lay 8

一旦遇到return关键字,控制就会传回给调用者,并且被调用的函数超出范围.因此,所有局部变量都从堆栈中弹出.所以你的第二个例子中的最后一个陈述是无关紧要的,警告是合理的