我试图在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
保持不变,所以我想知道如何为二维数组重新分配内存。
非常感谢任何建议或帮助。
答案 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。