【问题标题】:How to reallocate memory for a 2D float array?如何为二维浮点数组重新分配内存?
【发布时间】:2012-09-04 01:09:26
【问题描述】:

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

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 二维数组和malloc 再次,但我正在寻找更优雅的解决方案。有什么想法吗?

【问题讨论】:

    标签: c malloc realloc


    【解决方案1】:

    问题是 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 失败,则可能存在内存泄漏。由于您还没有进行错误检查,尽管现在这可能无关紧要。

    【讨论】:

      【解决方案2】:

      weights[2] 的 realloc 正在尝试重新分配未分配的内存,因为 weights[2] 从未分配过任何指针。

      通常,如果你想要一个二维数组,只需使用wegihts[width*y + x] 来索引数组,而不是创建一个指针数组。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-31
          • 2015-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多