c - 使用“calloc”进行内存分配失败
问题描述
我正在尝试使用calloc
函数分配内存,但是当数组大小(类型double
)为 48,000 x 48,000 时,它返回 NULL 指针。但是,它非常适用于 23,000 x 23,000 的另一种情况。从技术上讲,应该没有问题,因为我在这台计算机上有足够的 RAM。我也在使用 64 位库。
操作系统:Linux 64位
安装内存:376GB
编译器:英特尔 MKL 2019
编译器链接行:
icc Main.c -qopenmp -DMKL_ILP64 -m64 -I$MKLROOT/include \
-L$MKLROOT/lib/intel64 -lmkl_intel_ilp64 -lmkl_intel_thread \
-lmkl_core -liomp5 -lpthread -lm -ldl -O2 -o main.out
这里是我使用的一段代码:
int Jsize = 48000;
double *J = NULL;
J = (double *)calloc(Jsize*Jsize, sizeof(double));
if (J == NULL) printf("Null\n");
解决方案
您有一个int
名为 的对象Jsize
,初始化为 48000。然后您计算Jsize*Jsize
。该表达式的数学值为 ,2304000000
超过 2 31 -1。
系统上的类型int
几乎可以肯定是 32 位,这意味着乘法会溢出。行为未定义,但很可能您会得到否定的结果。
请记住,C 中表达式的类型是由表达式本身决定的,而不是由计算它的上下文决定的。将 an 乘以int
anint
总是会产生int
结果,即使该结果被分配给更大的值。
然后将该值作为第一个参数传递给calloc()
,它需要一个类型为 的参数size_t
。如果size_t
是 64 位(它可能是),那么你传递了一个巨大的正值,可能18446744071718584320
如果我的计算是正确的。
在我的 64 位 Ubuntu 系统上,当我printf
向您的代码添加几个调用时,我得到:
Jsize*Jsize = -1990967296
(size_t)(Jsize*Jsize) = 18446744071718584320
Null
你没有那么多记忆。
如果你Jsize
用 type定义size_t
,你至少可以尝试分配你想要的 17+ GiB。(在我的系统上,calloc
失败ENOMEM
,但我没有你那样多的 RAM。)
但是请注意,操作系统可能不允许您为一个进程分配那么多内存。
推荐阅读
- python - Airflow subdag codeview 显示 main-dag 的代码
- python - Django sqlmigrate 不显示原始 sql
- matlab - Python中的双边和自适应图像处理
- angular - 刷新 JWT 令牌 - Angular 8
- r - 具有分离数据和查找线性回归的 R 函数
- python - beautifulsoup - 无法从列表中获取信息
- visual-studio-code - Ubuntu18.04 32 位上的 Visual Studio Code 安装错误:“snap “code”在该架构的稳定版 (i386) 上不可用”
- java - 调用一个名为 printArray 的方法来打印我的随机数数组
- javascript - 滚动页面后更改导航栏
- archlinux - Manjaro 安装 ncurses5-compat-libs