重新分配后矩阵的第一个元素出现问题

时间:2016-12-01 16:36:22

标签: c matrix realloc

所以我尝试裁剪矩阵,然后使用realloc释放裁剪完成后留下的额外内存

这是代码和输出:

enter image description here

如您所见,v [0] [0]存在问题。

但是,如果我使用realloc删除代码,那一切都很好。我可能做错了,因为我之前从未使用过realloc,特别是在矩阵上没有。

1 个答案:

答案 0 :(得分:1)

裁剪方法中的重新分配存在一些问题。

呼叫不正确

电话

**v=realloc(*v,nl*sizeof(int*));

对于重新分配较少的栅格线是不正确的。 *v相当于v[0]的事实,您将在以下循环中再次重新分配,这将是一个线索。你在左手边和右手边有不同级别的v间接这一事实将是一个更强大的线索。你似乎想要的是

v = realloc(v, nl * sizeof(int *));

......甚至更好......

v = realloc(v, nl * sizeof(*v));

内存泄漏

您永远不会释放您裁剪掉的栅格线的分配,然后在缩小v的分配时丢失这些指针。泄漏这种记忆反而失去了重新分配的目的。在重新分配v之前,您需要释放不需要的栅格线。

不安全的重新分配

重新分配不一定就地发生,即使分配收缩也是如此。您希望缩小v点的分配(正如我上面的更正所示),但v按值传递给您的函数,因此修改后的值从realloc()不会传回给来电者。可能是修改后的值与原始值相同,在这种情况下你运气不好,但如果没有,那么你不仅泄漏了所有重新分配的内存,而且还给调用者留下了悬空指针。

没有重新分配失败的规定

由于您正在缩减分配,因此您的任何重新分配都不太可能失败。然而,即使在这种情况下,也不能保证realloc()能够成功。如果在任何给定的情况下失败,那么

  1. 通过用NULL覆盖指向它的指针来泄漏先前分配的内存。

  2. 您无法向来电者报告问题。

  3. 安全重新分配的常用模式需要realloc()的返回值的临时变量:

    int *t = realloc(v[i], nc * 3 * sizeof(*v[i]));
    
    if (t) {
        v[i] = t;
    } else {
        // handle reallocation error ...
    }