我在具有 18 GB RAM 的 64 位 Ubuntu 机器上运行以下代码,如您所见,当我尝试分配 2^31 字节时,我对 Malloc 的调用失败。我不确定为什么会发生这种情况,或者如何解决它(我已经尝试过编译器标志和 calloc())。我想知道是否有人可以向我解释为什么我无法在 64 位机器上分配更多空间以及如何解决此问题。
#include <stdio.h>
#include <stdlib.h>
//#include "svm_model_matlab.h"
//include "svm.h"
#include <math.h>
struct svm_node
{
int index;
double value;
};
//#define Malloc(type,n) (type *)calloc(n,sizeof(type))
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
int main()
{
int i;
for(i =25; i< 35; ++i)
{
printf("2^%d %d \n", i,(long int) pow(2,i));
svm_node* x_space = Malloc(struct svm_node,pow(2,i));
printf("the address is %x\n", x_space);
free(x_space);
}
return 0;
}
输出:
2^25 33554432
the address is 8513e010
2^26 67108864
the address is 6513e010
2^27 134217728
the address is 2513e010
2^28 268435456
the address is a513e010
2^29 536870912
the address is a513e010
2^30 1073741824
the address is 0
2^31 -2147483648
the address is 0
2^32 0
the address is 0
2^33 0
the address is 0
2^34 0
the address is 0
更新:
我发现了我遇到的问题:我目前在 64 位 Ubuntu linux 发行版上的 EC2 上运行我的代码,而 EC2 上的默认 linux 框有 0 个交换空间。这导致我的进程在请求比物理 RAM 更多的内存时出现段错误,因为它无法分页。创建交换文件后,我的问题就消失了。
谢谢你的帮助