gpt4 book ai didi

c - 在二维数组 c 上使用 realloc

转载 作者:行者123 更新时间:2023-11-30 17:10:08 24 4
gpt4 key购买 nike

我对 C 有点陌生,抱歉,如果我的问题有些模糊;

我需要在二维数组上使用 realloc 而不丢失它以前的数据,我的程序中有这个函数来做到这一点:

void modifyMatrix(int **iMat, int iRow, int iRow2, int iCol)
{
int i;
iMat = (int**)realloc(iMat, (iRow2)*sizeof(int*));
for(i=iRow; i<iRow2; i++)
{
iMat[i]=NULL;
}
for(i=0; i<iRow2; i++)
{
iMat[i]=(int*)realloc(iMat[i], (iCol)*sizeof(int));
}
}

其中 iRow 是原始大小,iRow 2 和 iCol 是新大小,并且全部在程序的其他位置捕获。

每当我尝试打印矩阵时,我不断在添加的行和列上获取垃圾数据或内存值,我做错了什么?

如果您需要完整的代码或需要澄清任何其他问题,请告诉我,提前致谢!

编辑:下面您可以看到我用来创建矩阵的代码

我的错,我想我应该补充一下,矩阵已经在程序的其他地方创建了,使用这个函数我只是想修改尺寸,感谢您的快速响应顺便说一句!,下面您可以找到我用来创建数组的函数

void createMatrix(int ***iMat, int iRow, int iCol)
{
int **iRow2 = (int**)calloc(iRow, sizeof(int*));
int i;
for (i=0; i<iRow; i++)
{
iRow2[i] = (int*)calloc(iCol, sizeof(int));
}
*iMat=iRow2;
}

此外,我只能使用已经创建的数组来执行此操作,无法创建临时数组(我知道这是最简单的方法)

最佳答案

在 c 中,变量是按值传递的,因此 modifyMatrix() 内的 iMat 不会修改调用函数中的变量。

您需要传递iMat的地址

void modifyMatrix(int ***iMat, int iRow, int iRow2, int iCol)
{
int i;
int **safe;

safe = realloc(*iMat, iRow2 * sizeof(int *));
if (safe == NULL)
return;
*iMat = safe;

for (i = 0 ; i < iRow ; i++)
{
int *keep_old_pointer;
keep_old_pointer = realloc(safe[i], iCol * sizeof(int));
if (keep_old_pointer == NULL)
do_something_allocation_failed();
safe[i] = keep_old_pointer;
}

for (int i = iRow ; i < iRow2 ; ++i)
safe[i] = malloc(iCol * sizeof(int));
}

此外,不要将 NULL 分配给每个元素,然后尝试 realloc() 因为如果 realloc() 在此有意义如果出现这种情况,您将使用 NULL 覆盖指针而不释放它们。

并且在检查分配是否成功之前不要覆盖 realloc()ed 指针,因为如果失败,您将无法释放前一个指针,因为您将丢失对它的引用,导致内存泄漏。

关于c - 在二维数组 c 上使用 realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33007171/

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