感谢您花时间阅读本文。我已经学习了几天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的数组(在添加更多内存之后),但是我想确保我之前确切地了解了它们之前发生了什么。再次感谢您的时间 - 并且欢迎提出建议(批评!)。
答案 0 :(得分:5)
int
在x86 linux上是32位,即使在64位模式下也是如此。这意味着int不能保存大于2 ^ 31-1(即2G)的值
尝试将arr_length
和arr_size
的类型更改为size_t