我正在尝试在c中调整一个矩阵的大小(double**m),理论上realloc()应该把旧矩阵的数据复制到新的调整大小的矩阵中。然而,矩阵中的值没有或者随机复制到新版本中。调整大小本身工作正常,至少它打印了正确的行数和列数。
double **matrix_resize(double **m, int rows, int cols)
{
int i;
double **safe;
safe = realloc(m, rows * sizeof(double*));
if (safe == NULL) return NULL;
m = safe;
for (i = 0; i < rows; ++i) {
double *safe2 = realloc(m[i], cols * sizeof(double));
if (safe2 == NULL) {
free(safe2);
free(safe);
return NULL;
}
m[i] = safe2;
free(safe2);
}
free(safe);
return m;
}
我期望函数返回一个新矩阵,其中包含新的行数和列数,还包含复制到新矩阵中的旧数据。行数和列数是正确的,但它没有正确复制数据。
以下是输出:
old matrix:
-----0---1---2---
0: | 1 | 1 | 1 |
---------------
1: | 1 | 1 | 1 |
---------------
2: | 1 | 1 | 1 |
---------------
resized matrix:
-----0---1---2---3---4---
0: | 0 | 0 | 1 | 0 | 1 |
-------------------------
1: | 0 | 0 | 0 | 0 | 0 |
-------------------------
2: | 1 | 1 | 1 | 0 | 0 |
-------------------------
3: | 0 | 0 | 1 | 0 | 0 |
-------------------------
4: | 0 | 0 | 1 | 0 | 0 |
-------------------------
2条答案
按热度按时间zf2sa74q1#
正如注解中提到的,函数需要新维度和旧维度来增加或减少内存分配。
不要释放
realloc
直接使用的临时指针(safe
和safe2
)。这由realloc
处理wqnecbli2#
因为
realloc
可能会失败,所以我建议分别改变行和列的大小。这样当realloc
失败时,你就可以正确地处理它。我写了一个函数,可以调整矩阵的行大小。如果
m
是NULL
,我们只返回calloc
而不是realloc
。如果
m
不是NULL
,并且old_rows
大于new_rows
,则我们存储将由realloc
丢失的指针以用于进一步的free
。如果
m
不是NULL
,并且old_rows
小于或等于new_rows
,我们只调用realloc
并初始化m
的新部分。对于改变列的大小,有
matrix_recol
。我们使用int
**指针代替int
。因为每一行调用realloc
可能失败。当它失败时,调用者可以观察row
以检查正确修改了多少行。