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

时间:2019-03-25 03:34:45

标签: c arrays limit

OSX系统可以从malloc中分配内存(返回非NULL)就可以了。但是,当访问位置通过1073741823时,发生分段错误: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

从理论上讲,它不应在那里死掉。

1 个答案:

答案 0 :(得分:2)

malloc()函数分配chars,而sizeof(int)通常大于1个字符。

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

请注意,malloc()通常会要求操作系统提供更大的内存量,并将其拆分为较小的部分。这意味着,当您访问未分配给malloc()的内容时,您仍然可以访问malloc()要求操作系统提供的大量内存,因此不会出现页面错误(“分段”错误”),只要您访问未分配的内容(更具体地说,当您尝试访问未为其分配内存的第536870912th int时,您就不会收到“分段错误”)