arrays - c中二维数组的最大大小
问题描述
我有一个 C 程序,在其中声明了一个大小为 8,388,608 * 23 的二维数组。当我运行该程序时,出现以下错误:
[1] 12142 segmentation fault (core dumped)
我认为数组的大小太大了。
这是我的代码:
int a[8388608][23];
a[0][0] = 10;
解决方案
您可能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);
.
推荐阅读
- bash - 避免使用“read”命令读取过去
- vuetify.js - 当我为 navdrawers 设置不同的设置时,为选项卡设置路由器视图
- android - Android:如何拦截 HTTPURLConnection 网络调用?
- sql - 部门表上的更新触发器,如果特定部门已停用,则将员工设置为活动状态
- android - 为 for 循环中绘制的每条路径设置动画
- android - 在自定义列表器服务中使用 ActivityContext
- android - facebook 的原生广告高级(统一)中介点击问题
- javascript - Generate a button and bind it to another onclick function
- json - Azure DataFactory 无法使用定义检查版本
- google-drive-api - 通过 python 使用 Google Drive API V3 获取 Google Drive 文件所有者的电子邮件地址