C存储巨大的阵列

时间:2014-03-31 03:50:59

标签: c arrays

感谢您花时间阅读本文。我已经学习了几天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_length增加到270000000(2.7亿),即使阵列大小超过2GB,我也会遇到分段错误。我目前正在运行64位OpenSuse 13.1,并且有6GB的RAM:

:~/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的数组(在添加更多内存之后),但是我想确保我之前确切地了解了它们之前发生了什么。再次感谢您的时间 - 并且欢迎提出建议(批评!)。

1 个答案:

答案 0 :(得分:5)

int在x86 linux上是32位,即使在64位模式下也是如此。这意味着int不能保存大于2 ^ 31-1(即2G)的值

尝试将arr_lengtharr_size的类型更改为size_t