为什么在 C 中访问数组有限制?

Why is there a limit in accessing array in C?

OSX 系统可以很好地从 malloc(return 非 NULL)分配内存。但是,当访问位置传递 1073741823 时,发生了 Segmentation fault: 11。谁能告诉我原因吗?

我可以访问 1073741824 以下的任何点(如代码所示)。我确实尝试访问 1073741824 点以上的随机位置,结果仍然是相同的错误,而 1073741824 以下的任何随机访问都工作得很好。

    void dead(){
        size_t pos = 0;
        size_t max =2147483647;
        max *= 2;
        printf("%ld\n",max);
        int* data = malloc(max);
        if(data == NULL){exit(1);}
        pos = 2147483647/2;
        pos-=3;
        for (; pos < 2147483647; pos++) {
            printf("%ld\n",pos);
            data[pos] = 10;
            printf("%i\n",data[pos]);
        }
    }

    4294967294
    1073741820
    10
    1073741821
    10
    1073741822
    10
    1073741823
    10
    1073741824
    Segmentation fault: 11

理论上应该不会死在那里

malloc() 函数分配 charssizeof(int) 通常比 1 个字符大得多。

例如;如果您为 2147483647 个字符分配内存,但 sizeof(int) 是“4 个字符”;那么你只为“2147483647/4 = 536870911 ints”分配了足够的内存。

请注意,malloc() 通常会要求操作系统提供更大的内存并将其分成更小的部分。这意味着当您访问未使用 malloc() 分配的内容时,您仍然可以访问 malloc() 向 OS 请求的更大内存量,因此您不会获得页面错误 ("segmentation fault") 一旦你访问了你没有分配的东西(更具体地说,当你尝试访问你没有分配的第 536870912 个 int 时,你不会得到 "segmentation fault" '为).

分配内存