谢谢你抽出时间来读这个。我学了几天C,一直没学会。我正在创建巨大的阵列(几GB),但似乎无法创建大于2GB的阵列。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Exploring 1d array sizes in c */

int main()
{
    int i;
    double mbs;
    int arr_length = 260000000;
    int arr_size = sizeof(double) * arr_length;
    double *arr = malloc(arr_size);

    for(i = 0; i < arr_length; i++)
        arr[i] = (double)i;

    /* Print array size */
    arr_size = (double)arr_size;
    mbs = (double)arr_size / pow(1024.0, 2);
    printf("The size of the array is %1.1f megabytes. \n", mbs);

    return 0;
}

当我运行代码时,我得到一个合理的结果:
:~/c-examples> gcc -o array-size array-size2.c
:~/c-examples> ./array-size
The size of the array is 1983.6 megabytes.

然而,如果我将arrúu长度增加到270000000(270000000),即使数组的大小刚刚超过2GB,我也会得到一个分段错误。我目前运行的是64位OpenSuse 13.1,内存为6GB:
:~/c-examples> free -h
             total       used       free     shared    buffers     cached
Mem:          5.6G       910M       4.7G        27M        12M       377M
-/+ buffers/cache:       520M       5.1G
Swap:         2.0G       307M       1.7G

我希望最终能够存储10-12GB大小的阵列(在添加更多RAM之后),但我想确保我完全理解之前发生的事情。再次感谢您的时间和建议(批评!)是最受欢迎的。

最佳答案

int在x86 linux上是32位的,即使在64位模式下也是如此。这意味着int不能保存大于2^31-1(即2G)的值
尝试将arr_lengtharr_size的类型更改为size_t

08-07 08:55