所以我尝试裁剪矩阵,然后使用realloc释放裁剪完成后留下的额外内存
这是代码和输出:
如您所见,v [0] [0]存在问题。
但是,如果我使用realloc删除代码,那一切都很好。我可能做错了,因为我之前从未使用过realloc,特别是在矩阵上没有。
答案 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()
能够成功。如果在任何给定的情况下失败,那么
通过用NULL
覆盖指向它的指针来泄漏先前分配的内存。
您无法向来电者报告问题。
安全重新分配的常用模式需要realloc()
的返回值的临时变量:
int *t = realloc(v[i], nc * 3 * sizeof(*v[i]));
if (t) {
v[i] = t;
} else {
// handle reallocation error ...
}