gpt4 book ai didi

c - 重新分配后矩阵第一个元素的问题

转载 作者:行者123 更新时间:2023-11-30 15:02:56 25 4
gpt4 key购买 nike

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

这是代码和输出:

enter image description here

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

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

最佳答案

您的裁剪方法中的重新分配存在几个问题。

调用不正确

来电

**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 ...
}

关于c - 重新分配后矩阵第一个元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40915851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com