我如何释放一个矩阵的某些行和列
所以我有创建这样一个矩阵:我如何释放一个矩阵的某些行和列
int **mat(int nl, int nc) {
int i;
int **v = malloc(nl * sizeof(int *));
for (i = 0; i < nl; i++) {
v[i] = calloc(nc, sizeof(int));
}
return v;
}
让输入后的说,它是:
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
我会只想保持前两排和第3列,并释放其他行和列的内存,因此它看起来像:
0 1 2
1 2 3
我该怎么做?
你必须:
- 免费全行2个第一批后(并设置
nl
2):
这样的:
for (i = 2; i < nl; i++) {
free(v[i]);
}
nl = 2;
- 执行其余行的
realloc
(将nc
设置为3) - 检查
realloc
返回码。在不太可能的情况下,它会返回NULL
,后备保留旧阵列(reference)
这样的:
nc = 3;
for (i = 0; i < nl; i++) {
int *new_v = realloc(v[i], nc*sizeof(int));
if (new_v!=NULL)
{
v[i] = new_v;
}
}
编辑:如果你没有改变nc
并打印“老”的价值观,它似乎什么也没做,因为旧值可能仍然存在(释放而不是意味着重置内存),但是您现在可以访问未分配的数据:执行另一次分配可以重新使用释放的数据并覆盖它。
我的确如此,在尝试打印矩阵之后,他们仍然没有释放。唯一发生的事情是,第三行的前2个元素现在为0,所以我想这是唯一被释放的东西。一切都是一样的 – Andrei
时间更仔细一点看你的打印程序。也许它正在读取阵列的结尾并导致混乱。 –
@Andrei:即使未分配,数据仍然存在,直到另一个分配破坏它们。 –
你的代码中没有矩阵(又名二维数组)。 'int **'不是二维数组,不能指向一个或代表一个。为什么你想释放内存?只是不要使用所有的空间。部分释放几乎没有获得任何东西,你只是分散存储空间。 – Olaf
我明白你的观点。但是如果你有像10000个元素那样的大行,并调整到4000个元素,这可能很有趣,因为你可以为这样的另一个“矩阵”留出空间,并且在realloc过程中不会有任何内存副本。内存被分割,但矩阵也是如此。这取决于调整大小之前/之后的行大小差异。 –