【问题标题】:Problems with the first element of a matrix after reallocrealloc后矩阵第一个元素的问题
【发布时间】:2016-12-01 16:36:21
【问题描述】:

所以我正在尝试裁剪一个矩阵,然后使用 realloc 来释放裁剪完成后剩余的额外内存

这是代码和输出:

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

但是,如果我用 realloc 删除代码,一切都很好。我可能做错了什么,因为我以前从未使用过 realloc,尤其是在矩阵上。

【问题讨论】:

  • 请同时标记您使用的语言(我假设为 C)。还将源代码显示为文本,而不是屏幕截图,以便人们更轻松地使用代码。
  • 函数怎么调用?您的**v = realloc(*v, nl*sizeof(int *)); 行存在很大问题——我认为,但由于我看不到您的调用代码或复制代码,因为它是图像,因此很难仔细检查。输出也应作为文本复制到问题中;人们不应该因阅读您的图片而受苦。

标签: c matrix realloc


【解决方案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. 您无法将问题报告给调用者。

安全重新分配的通常模式需要一个临时变量作为返回值realloc()

int *t = realloc(v[i], nc * 3 * sizeof(*v[i]));

if (t) {
    v[i] = t;
} else {
    // handle reallocation error ...
}

【讨论】:

  • 还有一个问题,你有时间吗?如何释放该矩阵的额外行和列?
  • @Andrei,您可以通过将指向每一行的指针传递给 free() 函数(每行一次)来释放每一行中所有列的空间。完成后,为行指针列表重新分配空间,正如您已经尝试做的那样,将清理分配给不需要的指针本身的空间。
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2020-09-20
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多