动态重新分配-2D阵列

时间:2019-02-15 10:25:00

标签: c

void matrixSetSize(double ***pMatrix, int size) {

    if (*pMatrix == NULL) { // void matrix
        *pMatrix = (double**)malloc(size * sizeof(double*));
        for (int i = 0; i < size; i++)
            *(*pMatrix + i) = (double*)malloc(size * sizeof(double));
    }
    else { // resize existing matrix
        double **pointer = (double**)realloc(*pMatrix, 2 * size * sizeof(double*));
        for(int i = 0; i < size; i++)
            pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));

        for (int i = size; i < 2 * size; i++)
            pointer[i] = (double*)malloc(size * sizeof(double));

        for(int i = 0; i < size; i++)
            free(*(*pMatrix + i));
        free(*pMatrix);

        *pMatrix = pointer;
    }

}

问题:当我尝试重新分配矩阵的大小时,代码将无法工作,我也不知道为什么。有人可以向我解释为什么不起作用吗?

2 个答案:

答案 0 :(得分:2)

这不能解决您发布的代码的问题,但也许可以帮助您获得更大的前景:

double (*matrix)[size] = malloc(initial_size * initial_size * sizeof(double));
matrix[0][0] = 42;
matrix[size-1][size-1] = 24;

/* resizing */
double (*new_mat)[new_size] = realloc(matrix, new_size*new_size*sizeof(double));
matrix[0][0] = 42;
matrix[new_size-1][new_size-1] = 24;

/* freeing */
free(new_mat);

不是更简单吗? 而且分配/释放的速度快得多,因为它只是一种分配。 而且使用起来非常快,因为:

  • 这是一个连续的内存块,因此对缓存友好
  • 您直接访问单元格,您对中间指针没有数据依赖性。

请,当您需要2D数组时,请制作2D数组,而不是N-1D数组的1D数组到指针。

两个警告:1)如果要在调整大小时保留旧数据,则需要手动移动它; 2)编译器必须支持C99。

答案 1 :(得分:1)

两个问题:

  1. 从重新分配代码中考虑以下几行:

    pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));
    pointer[i] = (double*)malloc(size * sizeof(double));
    

    第二秒,您分配的内存不如重新分配。

  2. 重新分配后,您可以释放旧数据,但是已经通过realloc调用完成了。

在不相关的音符上,用C表示should not cast the result of malloc (or it siblings)