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;
}
然后 x
在 PointA
不存在。当达到 int x[n];
时,它的生命周期开始。
请记住,这种存在仅存在于 C 的抽象计算模型方面。只要可观察的结果(例如程序的输出)相同,编译器就可以优化代码。因此,当输入 block 时,编译器生成的实际代码可能不会创建 x
。 (它可能根本不会创建 x
;它可以被完全优化掉。)
关于c - 何时/何处分配本地数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768137/