繁体   English   中英

了解作用域数组的存储方式

[英]Understanding how scoped arrays are stored

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

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

#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);
}

我得到数组元素一个接一个地存储。 但是,当不知道会有多少空间时,它们(在堆栈中?)怎么会有空间呢?

在具有自动存储功能(没有static关键字)的函数体中定义了局部作用域的对象存储在临时存储中,并在退出相应作用域时自动回收。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM