1

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

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

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

    int * l2;

    return 0;
}

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

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


编辑:

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

4

2 回答 2

2

这取决于实施。

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

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

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

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

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

于 2020-09-27T18:23:48.570 回答
1

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

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

于 2020-09-27T19:03:14.963 回答