c - 为什么函数内部的重新分配无法使用英特尔编译器执行?

标签 c malloc realloc

下面显示的是一段用 C 语言编写的代码,其目的是在函数内重新分配内存。我想知道为什么在执行过程中会崩溃,以及一种有效的方法。

int main()
     {
        int *kn_row, *kn_col, *uk_row, *uk_col;
        double *kn_val, *uk_val;
        kn_row=NULL, kn_col=NULL, kn_val=NULL, uk_row=NULL, uk_col=NULL, uk_val=NULL;
        evaluate_matrices(&kn_row, &kn_col, &kn_val, &uk_row, &uk_col, &uk_val);
        ........
     }

我尝试了两种类型的函数:

 evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val,
                   int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val)
      {    
        ........
        /* i,j, and k are calculated */
        *ptr_kn_row=(int*)realloc(*ptr_kn_row,k*sizeof(int));
        *ptr_kn_col=(int*)realloc(*ptr_kn_col,k*sizeof(int));
        *ptr_kn_val=(double*)realloc(*ptr_kn_val,k*sizeof(double));
        /* and*/
        *ptr_uk_row=(int*)realloc(*ptr_uk_row,j*sizeof(int));
        *ptr_uk_col=(int*)realloc(*ptr_uk_col,i*sizeof(int));
        *ptr_uk_val=(double*)realloc(*ptr_uk_val,i*sizeof(double));
      }

另一种方式是:

evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val,
                  int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val)
      {
         int *temp1,*temp2,*temp3,*temp4;
         double *temp5,*temp6;
         ..........
         temp1 =(int*)realloc(*ptr_kn_row, k*sizeof(*temp1));
         if(temp1){*ptr_kn_row = temp1;}
         temp2 =(int*)realloc(*ptr_kn_col, k*sizeof(*temp2));
         if(temp2){*ptr_kn_col = temp2;}
         temp5 =(double*) realloc(*ptr_kn_val, k*sizeof(*temp5));
         if(temp5){*ptr_kn_val = temp5;}
         ......
         temp3 = (int*)realloc(*ptr_uk_row, j*sizeof(*temp3));
         if(temp3){*ptr_uk_row = temp3;}
         temp4 = (int*)realloc(*ptr_uk_col, i*sizeof(*temp4));
         if(temp4){*ptr_uk_col = temp4;}
         temp6 = (double*)realloc(*ptr_uk_val, i*sizeof(*temp6));
         if(temp6){*ptr_uk_val = temp6;}
      }

最佳答案

如果内存分配失败,第一个函数就是一个小灾难。它用 NULL 覆盖指向先前分配的空间的指针,从而泄漏内存。如果您处理内存不足的策略是“立即退出”,那么这几乎不重要。如果您打算释放内存,那么您已经丢失了它 - 运气不好。

因此,第二个函数更好。不过,您可能需要跟踪数组大小,因此我怀疑您最好使用结构而不是原始指针,其中结构将包含大小信息以及指向分配数据的指针。您必须能够以某种方式确定为每个数组分配了多少空间。

您还需要跟踪哪些数组(如果有)无法重新分配 - 这样您就不会尝试访问未分配的空间。

关于c - 为什么函数内部的重新分配无法使用英特尔编译器执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20963441/

相关文章:

c - sizeof(int) 是 4 个字节,但只写了两个

计算 malloc() 和 realloc() 大小的正确方法?

c - Valgrind 错误 - 字符串 C 的分割

c - 调试了4个小时,还是找不到BUG

c - 动态内存分配 - realloc() : invalid next size

java - 在 Android 类 ID 和方法 ID 中从 C++ 调用 Java 方法

c - 当 p 声明为 int (*)[size] 并分配给数组时,*p 是什么

c - OpenMP 取消部分

c - 在 arm7 问题 : malloc return NULL 中使用 gcc 实现 malloc

c - Realloc pollfd - 转换为非标量