【发布时间】:2020-05-31 03:16:52
【问题描述】:
我很困惑当数组在函数等中时,它们是如何存储在可执行文件中的。
通过下面的代码,我相信要存储三个整数的值的空间是在可执行文件中创建的。
#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 %d\n", arr[0], arr[1]);
return false;
}
int main() {
myfunc(rand() % 50);
}
我得到数组元素一个接一个地存储。但是当不知道会有多少空间时,它们(在堆栈中)如何有空间?
【问题讨论】:
-
堆栈空间不是在编译时分配的,而是在运行时调用时分配的,所以无论调用多少次函数或是否递归都无关紧要。堆栈帧的总大小在编译时计算,当函数被调用时,
stack_frame_size字节在堆栈上分配,堆栈指针也相应调整。这足以解决混乱吗?