c - 如何为二维数组重新分配内存?

标签 c pointers

<分区>

我试图在 C 中实现 Viterbi 解码器。

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

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 不断变化,所以我想知道如何为二维数组重新分配内存。

如有任何建议或帮助,我们将不胜感激。

最佳答案

您可以像 (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
}

为二维数组 place_table 重新分配内存是不正确的,因为随着维度的变化,旧数组中的值将被重新解释,就好像它们是新数组的元素一样大批。这将导致行环绕。 (由皮特柯克姆提供)。因此,您需要分配一个新数组并将旧数组中的值复制到它,然后释放旧数组。

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 .

关于c - 如何为二维数组重新分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861072/

相关文章:

c - 为什么我的函数没有挤压打印任何内容?

c - 冲突的 Bison 循环

c - 在 if 语句的 bool 表达式中使用指针

c - WSAConnectByName 超时

php - 高性能Web Spider的开发

calloc 返回指向自身的指针

c - C9 9's "restrict"关于指向指针的指针的语义是什么?

c - 如何对链表指针进行排序

c - 传递的指针返回意外错误

c - 函数返回指针的行为不明确?