【发布时间】:2017-05-26 10:04:44
【问题描述】:
我正在使用具有 128GB 内存的服务器进行一些计算。我需要malloc() 一个大小为 56120 * 56120 的二维浮点数组。示例代码如下:
int main(int argc, char const *argv[])
{
float *ls;
int num = 56120,i,j;
ls = (float *)malloc((num * num)*sizeof(float));
if(ls == NULL){
cout << "malloc failed !!!" << endl;
while(1);
}
cout << "malloc succeeded ~~~" << endl;
return 0;
}
代码编译成功,但是当我运行它时,它显示"malloc failed !!!"。正如我计算的那样,保存整个数组只需要大约 11GB 的内存。在开始编写代码之前,我检查了服务器,发现有 110GB 可用内存。为什么会出现错误?
我还发现,如果我将num 减少到,比如 40000,那么 malloc 就会成功。
这是否意味着malloc()可以分配的最大内存有限制?
另外,如果我改变分配方式,直接声明一个这样大小的二维浮点数组,如下:
int main(int argc, char const *argv[])
{
int num = 56120,i,j;
float ls[3149454400];
if(ls == NULL){
cout << "malloc failed !!!" << endl;
while(1);
}
cout << "malloc succeeded ~~~" << endl;
for(i = num - 10 ; i < num; i ++){
for( j = num - 10; j < num ; j++){
ls[i*num + j] = 1;
}
}
for(i = num - 11 ; i < num; i ++){
for( j = num - 11; j < num ; j++){
cout << ls[i*num + j] << endl;
}
}
return 0;
}
然后我编译并运行它。我收到了"Segmentation fault"。
我该如何解决这个问题?
【问题讨论】:
-
3149454400 浮点数对于堆栈分配的数组来说是一个位太多...
-
一个原因可能是分配的内存必须是连续的。如果没有这么大的块可用,那么分配将失败。
-
至于数组的问题,记住大部分编译器都把自己的局部变量放在栈上,栈是相当有限的(Linux上默认进程栈大小是8MB)。
-
你的平台是什么? linux 64位?
-
你真的应该删除C标签,看看你如何使用
std::cout和std::endl。那么这当然会带来一个问题,为什么首先使用malloc,为什么使用NULL而不是nullptr,以及为什么在使用变量之前声明变量。