如何重新分配二维数组的内存?

时间:2014-02-18 17:28:42

标签: c pointers

我试图在C中实现维特比解码器。

所以我想到了使用我想动态创建的二维数组。以下是动态创建的2D数组的示例代码:

place_table = (int **)malloc((no_places+1)*sizeof(int *));

for(i = 1; i <= no_places; i++)
    place_table[i] = (int *)malloc((no_places+1)*sizeof(int));

这个二维数组的大小在我的解码器中保持不变,即no_places保持不变,所以我想知道如何为二维数组重新分配内存。

非常感谢任何建议或帮助。

1 个答案:

答案 0 :(得分:2)

您可以为二维数组动态分配内存为(C99):

int no_places;
int n = no_places + 1;  // for brevity in the following statement
int (*place_table)[n] = malloc(sizeof(int[n][n]));

// check for NULL
if(place_table == NULL) {
    // there's a problem
    // handle it
}
else {
    // you are good to go
}

为2-D数组place_table重新分配内存是不正确的,因为在维度发生变化时,旧数组中的值将被重新解释,就好像它们是新数组的元素一样。这将导致行环绕。 (Pete Kirkham友情提供)。因此,您需要分配一个新数组并将旧数组中的值复制到该数组,然后释放旧数组。

int old_n = n;
// value of n has been changed
// allocate a new array
int (*new_place_table)[n] = malloc(sizeof(int[n][n]));

// check for NULL and accordingly proceed
// if not NULL, copy place_table to new_place_table

for(int i = 0; i < old_n; i++) {
    for(int j = 0; j < old_n; j++) {
        new_place_table[i][j] = place_table[i][j];
    }
}

free(place_table);

// do stuff with new_place_table

free(new_place_table); 

另请注意,您无需转换malloc的结果。执行此操作没有任何好处,如果您忘记包含stdlib.h头文件,它可能会导致错误,未定义的行为和程序崩溃。阅读详细信息here