首页 > 解决方案 > c中二维数组的最大大小

问题描述

我有一个 C 程序,在其中声明了一个大小为 8,388,608 * 23 的二维数组。当我运行该程序时,出现以下错误:

[1]    12142 segmentation fault (core dumped)

我认为数组的大小太大了。

这是我的代码:

int a[8388608][23];
a[0][0] = 10;

标签: arrayscmultidimensional-array

解决方案


您可能int a[8388608][23];在函数内部声明,并且 C 实现尝试在堆栈上分配空间。

在 macOS、Linux 和 Windows 上的常见 C 实现中,默认情况下为堆栈指定的空间范围从 1 MiB 到 8 MiB(8,388,608 字节),具体取决于操作系统以及它是主线程还是衍生线程。由于您的数组超出了堆栈的空间,因此使用它访问了未为您的进程映射的内存并产生了分段错误。

C 标准要求实现具有足够的内存来执行至少一些程序(C 2018 5.2.4.1),但允许对可用内存进行限制,并且不需要实现在程序执行时提供任何警告或错误处理超过限制。它允许程序失败和中止。

可以通过链接器选项设置程序的堆栈大小。但是,通常最好不要将堆栈用于大量数据。如果一个程序在其整个执行过程中需要一个数组,它可以通过在任何函数之外定义它来静态分配。然后将在链接期间计算所需的内存量,并在加载程序时保留。

当一个函数暂时需要大量内存时,应该动态分配。你可以这样做malloc

int (*a)[23] = malloc(8388608 * sizeof *a);
if (!a)
{
    fprintf(stderr, "Error, unable to allocate memory.\n");
    exit(EXIT_FAILURE);
}

当函数用完内存后,它应该用free(a);.


推荐阅读