取消引用的未初始化指针在内存中的位置?

问题描述

我从嵌入式系统入门课程测验中得到了c中的代码示例:

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

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

    int * l2;

    return 0;
}

我想知道内存中* l2 的内存段,子段,权限和生存期。

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


编辑:

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

解决方法

这取决于实现方式。

通常,因为它是局部自动变量,所以它将位于堆栈中。其生存期与main函数的生存期相同。只能从主功能访问它。

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

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

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

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

,

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

除非您的特定实现确切记录了未初始化指针的处理方式,否则您不能对*l2的值说任何话。