首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为二维数组重新分配内存?

问如何为二维数组重新分配内存?
EN

Stack Overflow用户
提问于 2014-02-18 17:28:41
回答 1查看 268关注 0票数 0

我试图用C语言实现维特比译码器。

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

代码语言:javascript
复制
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一直在变化,所以我想知道如何重新分配这个二维数组的内存。

任何建议或帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 18:12:37

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

代码语言:javascript
复制
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重新分配内存是不正确的,因为随着维度的变化,旧数组中的值将被重新解释,就好像它们是新数组的元素一样。这将导致行被环绕。(由皮特·柯克姆提供)。因此,您需要分配一个新数组并将值从旧数组复制到它,然后释放旧数组。

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21861072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档