0

因此,我使用以下函数为双指针创建并分配了内存:

void mallocDoubleArr(double ***arr, int size)
{
    printf("Here: %d", size);
    int i, j;

    *arr = malloc(size * sizeof(double*));

    for(i = 0; i < size; i++)
    {
        (*arr)[i]= malloc(size*sizeof(double));
        for (j = 0; j < size; j++)
        {
            (*arr)[i][j] = 0;
        }
    }
}

我使用以下方法调用了该函数:

    double **G; //Create double pointer to hold 2d matrix

    mallocDoubleArr(&G, numNodes);

现在我的问题是我将如何编写一个函数来释放内存?

我试过这样的事情:

void freeDoubleArr(double ***arr, int size)
{
    int i, j;

    for (i = 0; i < size; i++)
        for (j = 0; j < size; j++)
            free((arr)[i]);
    free(arr);
}
4

2 回答 2

3

似乎您想将指针的地址传递给您的freeDoubleArr喜欢freeDoubleArr(&G, numnodes)(我宁愿称之为deleteDoubleArr)。然后你需要有

void freeDoubleArr(double ***arrptr, int size)
{
   double** arr = *arrptr;
   for (int i = 0; i < size; i++)
      free(arr[i]);
   free (arr);
   *arrptr = NULL;
}

但是,您可以决定您的方阵不表示为指向数组的指针数组,而只是表示为普通数组。也许使用灵活的数组成员(C99 及更高版本),如

struct matrix_st {
   unsigned size;
   double arr[]; /* flexible array of size*size elements */
};

可能很有用,约定实际上  arr是一个元素数组size*size(每个元素都是 a double)。

然后,您可以定义快速访问和 mutator 内联函数。

inline double get_element(struct matrix_st *m, int i, int j) {
   assert (m != NULL);
   unsigned s = m->size;
   assert (i>=0 && i<s && j>=0 && j<s);
   return m->arr[s*i+j];
}

inline void put_element(struct matrix_st* m, int i, int j, double x) {
   assert (m != NULL);
   unsigned s = m->size;
   assert (i>=0 && i<s && j>=0 && j<s);
   m->arr[i*s+j] = x;
}

当优化和使用<assert.h>(参见assert(3) ...)并使用-DNDEBUG上述访问器get_element和修改器进行编译时,put_element可能会比您的代码更快。

并且矩阵创建只是(创建一个零矩阵):

struct matrix_st* make_matrix (unsigned size) {
   struct matrix_st* m = malloc(sizeof (struct matrix_st)
                                + size*size*sizeof(double);
   if (!m) { perror("malloc"); exit(EXIT_FAILURE); };
   m->size = size;
   memset(m->arr, 0, sizeof(double)*size*size);
   return m;
 }

然后用户可以只使用一个调用free来释放这样的矩阵。

顺便说一句,如果在 Linux 上编码,请使用valgrind内存泄漏检测器和gdb调试器进行编译gcc -Wall -g和使用。

于 2013-10-22T19:20:25.253 回答
1

您的免费代码不应该更像以下内容:

void freeDoubleArr(double ***arr, int size)
{
    int i;

    for (i = 0; i < size; i++)
        free((*arr)[i]);
    free(*arr);
}

您甚至没有在任何地方使用“j”参数,因此内部 for 循环将导致它尝试释放相同区域的内存大小时间。您还需要取消引用传入的指针以获取 malloc 的指针,就像您将 malloc 的结果分配给它时所做的那样。

此外,当说某事不起作用时,包括您所看到的特定错误或使您认为它无法正常工作的原因会很有用。

于 2013-10-22T19:33:23.427 回答