C语言 了解如何存储作用域数组



我很困惑当数组在函数等中时,数组是如何存储在可执行文件中的。

使用下面的代码,我相信在可执行文件中为要存储的三个整数的值留出了空间。

#include <stdlib.h>
int main() {
int arr[] = {rand(), rand(), rand()};
}

我在考虑函数中的数组,每个调用将使用与其他调用相同的空间来存储它们的数组。但后来我认为递归调用会覆盖彼此的数组。我不明白如何留出它们的空间,尤其是递归和未知数量的调用。我试着举个例子:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool myfunc(unsigned val) {
int arr[] = {rand() % 10, rand() % 10};
if (val == 0)
return true;
myfunc(val - 1);
printf("%d %dn", arr[0], arr[1]);
return false;
}
int main() {
myfunc(rand() % 50);
}

我得到数组元素一个接一个地存储。但是,当它被解开时,它们(在堆栈中?(如何有空间呢?

在具有自动存储(不带static关键字(的函数体中使用本地作用域定义的对象存储在临时存储中,并在退出相应作用域时自动回收。

典型的现代架构使用运行时堆栈来实现这一点:如果在编译时已知大小,则堆栈指针寄存器在进入作用域时会减少一个固定量,就像您的示例一样:int arr[] = {rand() % 10, rand() % 10};定义一个 2int的数组,通常为 8 个字节。

如果大小仅在运行时已知,则堆栈指针将按运行时计算的值递减,如果此大小太大,可能会导致未定义的行为。堆栈指针在离开函数时恢复为其原始值。

最新更新