如何重新分配2D浮点数组的内存?

时间:2012-09-11 06:37:52

标签: c malloc realloc

我尝试了以下方法来重新分配大小从2X2到3X3的2D float数组。在为segfault尝试realloc内存时,代码会抛出weights[2]

num_vertices = 2;
float **weights = malloc(num_vertices*sizeof(float *));      // weight array matrix
for(i = 0; i < num_vertices; i++){
    weights[i] = malloc(num_vertices*sizeof(float));
}

num_vertices = 3;
weights = realloc(weights, num_vertices*sizeof(float *));      // weight array matrix
for(i = 0; i < num_vertices; i++){       
    weights[i] = realloc(weights[i], num_vertices*sizeof(float));
}

当然,我可以再次free 2D数组和malloc,但我正在寻找更优雅的解决方案。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

问题是在重新分配weights[2]weights包含垃圾。

你可能想做这样的事情:

new_vertices = 3;
weights = realloc(weights, new_vertices*sizeof(float *));
for(i = 0; i < new_vertices; i++)
{
    if (i >= num_vertices)
        weights[i] = NULL;
    weights[i] = realloc(weights[i], new_vertices*sizeof(float));
}
num_vertices = new_vertices;

请注意,如果realloc失败,您可能会发生内存泄漏。因为你还没有错误检查,但现在这可能无关紧要。

答案 1 :(得分:3)

weights[2]的重新分配试图重新分配未分配的内存,因为weights[2]从未被分配任何指针。

通常,如果你想要一个2D数组,只需使用wegihts[width*y + x]索引数组,而不是制作一个指针数组。

答案 2 :(得分:2)

您无法循环到 new 顶点计数,因为外部数组的那部分尚未分配并包含未初始化的数据。而是循环到新的num_vertices - 1并重新分配,然后创建一个全新的weights[num_verticees - 1]