【问题标题】:Location of a dereferenced uninitialized pointer in memory?取消引用的未初始化指针在内存中的位置?
【发布时间】:2021-01-13 10:10:34
【问题描述】:

我在一个介绍性的嵌入式系统课程测验中有这个 c 代码示例:

#include <stdlib.h>
#include <stdint.h>

//cross-compiled for MSP432 with cortex-m0plus
int main() {

    int * l2;

    return 0;
}

我想知道*l2在内存中的内存段、子段、权限和生命周期。

我的理解是指针 l2 将首先分配在堆栈子段中,然后因为它未初始化,它将获得一个垃圾值,在这种情况下,它是它在堆栈中找到的任何值;我认为它在具有静态生命周期的 .text 或 .const 中,并且这些答案都不正确,所以我在这里遗漏了什么吗?


编辑:

在我没有正确解决这一点的情况下通过了测验后,解决方案表显示它在无限期的堆中。我从这个答案中得到的是:因为指针本身存储在堆栈中并且它指向的对象未初始化(它不是自动或静态的),所以它存储在堆中..我猜??

【问题讨论】:

  • 对我来说你的问题还不清楚。首先你说我明白......将在堆栈中分配然后你说我假设它在具有静态生命周期的.text或.const中请解释?
  • 除非你递归地调用函数main(你可能不是),那么l2 的生命周期将与具有静态生命周期的变量大致相同。它只会在main 返回时被销毁,这是在所有具有静态生命周期的变量被销毁之前不久。
  • @AndreasWenzel 不需要:godbolt.org/z/xYeno7 我们的程序将永远执行,但这个对象早已结束了它的生命
  • @P__J__:好的,你是对的,有些人为的例子并非如此。 :-)
  • @4386427 我的意思是解释我错误答案背后的思考过程,以便任何人都可以纠正我的误解。

标签: c pointers embedded memory-segmentation static-memory-allocation


【解决方案1】:

l2 中存储的值是不确定的 - 它甚至可以是一个陷阱表示。 l2 对象本身具有auto 存储持续时间,并且它的生命周期仅限于封闭函数的生命周期。在内存段方面转换成什么取决于具体的实现。

你不能对*l2 的值说任何事情,除非你的具体实现记录了如何处理未初始化的指针。

【讨论】:

    【解决方案2】:

    这取决于实现。

    通常因为它是本地自动变量,它会位于堆栈上。它的生命周期与main 函数的生命周期相同。它只能从主函数访问。

    但在现实生活中,由于您不对其进行任何操作,因此即使您在没有优化 https://godbolt.org/z/1Y6W5j 的情况下编译它,编译器也会在不需要时将其删除。在这种情况下,它的位置是“无处”

    对象也可以保存在寄存器中,而不是放在内存中https://godbolt.org/z/8nWxxz

    大多数现代 C 实现将代码放在 .text 段中,在 .data 段中初始化静态存储位置变量,在 .bss 段中未初始化静态存储位置变量,并且在 .rodata 段中只读数据.您的程序中可能还有很多其他内存段 - 但有很多选择。您还可以拥有自己的段并在其中放置对象。

    堆栈和堆位置是 100% 实现定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2019-10-28
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多