【问题标题】:Difference between static and non-static array in CC中静态和非静态数组的区别
【发布时间】:2018-04-20 07:24:23
【问题描述】:

我想知道为什么这可以达到 1e8 的大小。对于大于 1e8 的尺寸,编译器会说“尺寸太大”。

#include <stdio.h>
int main() {
    printf("allocating...\n");
    static float m[(int)1e8];
    printf("done\n");
}

虽然这仅适用于 1e5。如果 size 设置为 1e6,它确实可以正常编译,但在打印第一行之前就在运行时崩溃。

#include <stdio.h>
int main() {
    printf("allocating...\n");
    float m[(int)1e5];
    printf("done\n");
}

这些限制是什么?为什么static 有更高的限制?


编辑:平台是 windows7 中的 MinGW64。还没在linux下测试过。

【问题讨论】:

  • 如果您使用的是 Linux 系统,您可以键入 ulimit -s 来确定允许的最大堆栈大小。这通常是 8 MB。 (以 1 kB 的倍数打印)。

标签: c arrays memory static


【解决方案1】:

在 C 中,具有 static 存储持续时间的对象在程序的整个执行时间内都存在,而具有 automatic 存储持续时间的对象(这是在一个函数范围)只存在于它的范围内。直接后果是您将永远只有一个静态版本的实例,而每次调用该函数时都会创建一个自动对象。 C 对大小限制没有任何意见。

当然,有一个简单的解释:大多数 C 实现使用 堆栈 来存储自动变量。每个函数调用都有一个自己的堆栈帧,因此这可以确保每个函数都使用它自己的“局部变量”实例。操作系统限制了堆栈的总大小,这就是您在这里遇到的限制。另一方面,具有静态存储持续时间的对象直接在您的可执行文件中定义,该内存将在您的进程启动时从操作系统中获取。

【讨论】:

    【解决方案2】:

    静态声明通常在程序启动时分配,并且在程序运行期间仍然分配,而非静态声明通常存储在堆栈中,并且可以在函数终止后立即重用。这可能就是这两种分配行为不同的原因。

    我想说的是,在第二种情况下,您的程序崩溃的事实与您的操作系统如何处理堆栈有关。但我不能确定

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 2021-02-08
      • 2016-08-29
      • 2020-07-13
      • 2010-10-30
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多