malloc无法分配内存

时间:2018-12-23 16:28:54

标签: c malloc defragmentation

我正在编写C代码来求解欧拉方程。我的代码在群集上工作正常,但在我的PC上却无法正常工作。似乎与malloc()有关。它无法分配请求的内存,并且失败。

我如何使其工作?与碎片整理有关吗?但是系统设置显示为(碎片整理为0%)。

这里只包含malloc()代码的一部分。

double **u, **rho_u, **rho,    
int Size = 1000;
u = (double**)malloc(Size*sizeof(double*));
for(i=0;i<=Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

rho_u = (double**)malloc(Size*sizeof(double*));
for(i=0;i<=Size;i++)
    rho_u[i] = (double*)malloc(Size*sizeof(double));

3 个答案:

答案 0 :(得分:5)

您可能在这里破坏了堆:

for(i=0;i<=Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

您分配了1001个指针,但只分配了1000个。 正确的版本:

for(i=0;i<Size;i++)
    u[i] = (double*)malloc(Size*sizeof(double));

与第二个循环相同。

答案 1 :(得分:4)

仔细阅读 documentation of malloc。它可能失败,并且当它失败时,malloc返回NULL(失败原因由errno给出,您经常使用{{3}来显示) }。

因此,您应该测试malloc是否失败。典型的代码至少是:

u = (double**)malloc(Size*sizeof(double*));
if (u==NULL) { perror ("malloc u"); exit(EXIT_FAILURE); };

,同样也适用于您的rho_u和每个rho_u[i]

某些操作系统可能提供perror。这是我不喜欢的功能。

考虑完全初始化每个存储区。在有效内存区域(或有效地址)之外使用内存是memory overcomitment(并且您的程序有一个内存,undefined behavior注意到)。成为Ctx's answer

我还建议使用scared。这是一个非常方便的工具,可用来查找与内存相关的错误,并且可能已经检测到您的错误。

答案 2 :(得分:2)

观察:

  • 避免进行类型转换malloc(),请阅读Do I cast the result of malloc?
  • 检查malloc()的返回值并进行正确的错误处理。
  • 将循环条件从i<=Size更改为i<Size,因为它导致缓冲区溢出,因为较早的内存仅分配给Size行而不是size+1行。

尝试此版本:

int Size = 1000;
double **u = malloc(Size * sizeof(*u)); /* typecasting is not needed */
if(u == NULL) {
   /* @TODO error handling */
}
for(i=0;i<Size;i++) { /* loop should rotate only 1000 times not 1001 times */
    u[i] = malloc(Size * sizeof(**u));
    if(u[i] == NULL) {
         /* @TODO error handling */
    }
}

rho_urho类似。