C中的数组索引限制

adk*_*adk 3 c arrays

在Linux上,有16 GB的RAM,为什么会出现以下段错误:

#include <stdlib.h>

#define N 44000

int main(void) {
    long width = N*2 - 1;
    int * c = (int *) calloc(width*N, sizeof(int));
    c[N/2] = 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据GDB,问题来自c [N/2] = 1,但是原因是什么?

Jar*_*Par 6

这可能是因为calloc的返回值为NULL.

框中的物理RAM量与使用calloc/malloc/realloc分配的内存量无直接关系.这更直接取决于您的流程可用的剩余虚拟内存量.

  • 根据我的计算(假设`int`是4个字节)你要求操作系统提供~14GB的连续空间,在这种情况下我可以看到失败. (2认同)

Tyl*_*nry 6

您的计算溢出了32位有符号整数的范围,这可能是"长".你应该使用size_t而不是long.这保证能够保持系统可以分配的最大内存块的大小.