c - 何时/何处分配本地数组?

标签 c arrays gcc memory

https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation-and-C.html描述了局部变量的自动分配。我知道局部变量通常分配在堆栈上。我可以想象 int 是如何在堆栈上分配的;只是插入它的值(value)。但是如何分配数组?

例如,如果您声明一个数组 char str[10];,那 10 个字节的空间是在堆栈上,还是分配到其他地方,只有 str 指针被压入堆栈?如果是后者,那10个字节的空间分配在哪里?

此外,具体什么时候分配局部变量,包括数组?我通常将堆分配称为“动态分配”,这意味着自动变量不是动态分配的。但是自动变量可能在控制流构造和函数体中声明,因此编译器不可能在运行前知道自动变量将占用多少空间。所以自动变量也必须动态分配,对吧?

编辑:我想强调这个问题的前半部分。我最感兴趣的是了解何时何地为本地数组分配空间。在堆栈上?其他地方?

编辑 2: 我最初为这个问题包含 C++ 标记时犯了一个错误。我只想问有关 C 语言及其实现的问题。对于任何混淆,我深表歉意。

最佳答案

在 C 2018 标准中,第 6.2.4 条第 6 和第 7 段告诉我们具有自动存储持续时间的对象的生命周期。第 6 段涵盖了此类不是可变长度数组的对象:

… its lifetime extends from entry into the block with which it is associated until execution of that block ends in any way. (Entering an enclosed block or calling a function suspends, but does not end, execution of the current block.) If the block is entered recursively, a new instance of the object is created each time.

因此,如果我们有这段代码:

{
    PointA;
    int x = 3;
    PointB;
}

然后 x 一旦执行到 PointA 就存在于 C 模型中——它的 block 被进入,那是 x 的生命周期> 开始。但是,虽然 x 已经存在于 PointA 中,但它的值是不确定的。初始化仅在达到定义时发生。

第 7 段介绍了可变长度数组:

… its lifetime extends from the declaration of the object until execution of the program leaves the scope of the declaration.

所以,如果我们有这段代码:

{
    PointA;
    int x[n]; // n is some variable.
    PointB;
}

然后 xPointA 不存在。当达到 int x[n]; 时,它的生命周期开始。

请记住,这种存在仅存在于 C 的抽象计算模型方面。只要可观察的结果(例如程序的输出)相同,编译器就可以优化代码。因此,当输入 block 时,编译器生成的实际代码可能不会创建 x。 (它可能根本不会创建 x;它可以被完全优化掉。)

关于c - 何时/何处分配本地数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768137/

相关文章:

使用 VC++ 命令行创建 .dll 和 .lib 文件

无法将 C 程序转换为 Ruby

c - 在 Ubuntu 16.04 上构建 DPDK 17.02 和 16.11 时出错

c - 在字符串中的每个字符之间添加 '-' ?

c++ - 动态创建指针数组

linux - 静态编译glfw

c - 如何从图像/二进制文件中检查结构的值?

c - IAR 嵌入式工作台。 __iar_program_start 在哪里?

java - 将 double 组转换为 float 组

c++ - 项目错误中的 std::map