c - c 中的 & 符号错误和生命周期

标签 c pointers compiler-warnings local-variables

众所周知,局部变量具有局部作用域和生存期。考虑以下代码:

      int* abc()
      {
            int m;
            return(&m);
       }
       void main()
       {
             int* p=abc();
             *p=32;
        }

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

但是,请考虑以下代码:

      int* abc()
      {
           int m;
           return(&m);
           int p=9;
       }
       void main()
       {
           int* p=abc();
           *p=32;
       }

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

最佳答案

首先,请注意 int p=9; 永远不会到达,因此您的两个版本在功能上是相同的。程序将为m分配内存并返回该内存的地址; return 语句下面的任何代码都是无法访问的。

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

关于c - c 中的 & 符号错误和生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591293/

相关文章:

c++ - 仅针对部分翻译单元有选择地禁用 GCC 警告

c - 来自 int 的基本 C 强制转换警告指针

c++ - 在堆上声明一个数组

c++ - 调用 boolean 函数但出现错误 "no matching function to call"?

c - 为什么我的代码会产生段错误?

c - 访问单个结构成员是否会将整个结构拉入缓存?

c - 使用指针导航数组,而不是使用 int

ios - 抑制 Swift 编译器警告

c - 下标值既不是数组也不是指针也不是 vector (字符位置)

c - 在 c 中使用位输出