谢谢你抽出时间来读这个。我学了几天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_length
和arr_size
的类型更改为size_t