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



OSX系统可以从malloc分配内存(返回非NULL(。 但是,当访问仓位传递1073741823时,发生了分割错误:11。 谁能教育我原因?

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

    void dead(){
        size_t pos = 0;
        size_t max =2147483647;
        max *= 2;
        printf("%ldn",max);
        int* data = malloc(max);
        if(data == NULL){exit(1);}
        pos = 2147483647/2;
        pos-=3;
        for (; pos < 2147483647; pos++) {
            printf("%ldn",pos);
            data[pos] = 10;
            printf("%in",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()要求操作系统提供的大量内存,因此一旦您访问未分配的内容,您就不会立即收到页面错误("分段错误"((更具体地说,一旦您尝试访问未为其分配内存的第 536870912 int,您就不会收到"分段错误"(。

最新更新