c-内存中未被引用的未初始化指针的位置



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

#include <stdlib.h>
#include <stdint.h>
//cross-compiled for MSP432 with cortex-m0plus
int main() {
int * l2;
return 0;
}

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

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


编辑:

在我没有正确解决这一点就通过了测试之后,解决方案表显示它在堆中,寿命不确定。我从这个答案中得到的是:因为指针本身存储在堆栈中,而它指向的对象未初始化(它不是自动或静态的(,所以它存储在堆中。。我想??

这取决于实现。

通常,由于它是局部自动变量,它将位于堆栈上。其寿命与main函数的寿命相同。只能从主功能访问。

但在现实生活中,由于你不使用它做任何事情,即使你在没有优化的情况下编译它,它也会被编译器视为不需要而删除https://godbolt.org/z/1Y6W5j。在这种情况下,它的位置是";无处";

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

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

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

存储在l2中的值是不确定的,甚至可以是陷阱表示。l2对象本身具有auto存储持续时间,并且其生存期被限制为封闭函数的生存期。就内存段而言,这转化为什么取决于具体的实现方式。

关于*l2的值,您不能说任何,除非您的特定实现记录了如何处理未初始化的指针。

最新更新