我正在使用一台内存为128GB的服务器进行某些计算。 我需要malloc()
一个大小为56120 * 56120的2D浮点数组。以下是示例代码:
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()
可以分配的最大内存有限制?此外,如果我改变分配的方式,直接声明一个2D浮点数组,大小如下:
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"
。
我该如何解决这个问题?
std::cout
和std::endl
。这当然引出了一个问题:为什么首先要使用malloc
,为什么使用NULL
而不是nullptr
,以及为什么在使用变量之前要声明它们。 - Christian Hackl(size_t)i * i * sizeof float
的顺序已经实现了所需的扩展。通过反转顺序sizeof (float) * i * i
可以达到同样的效果。至少这样可以避免int
溢出导致的未定义行为。 - chux - Reinstate Monica