C 如何释放矩阵的某些行和列
所以我有一个矩阵,它是这样创建的:C 如何释放矩阵的某些行和列,c,matrix,free,realloc,C,Matrix,Free,Realloc,所以我有一个矩阵,它是这样创建的: 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; } 我只想保留前2行和前3列,并释放其他行和列的内存,因此看起来像: 0 1 2 1 2 3 我该怎么做?您必须: 在前两行之后释放
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;
}
我只想保留前2行和前3列,并释放其他行和列的内存,因此看起来像:
0 1 2
1 2 3
我该怎么做?您必须:
- 在前两行之后释放整行(并将
设置为2):nl
for (i = 2; i < nl; i++) {
free(v[i]);
}
nl = 2;
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):nl
for (i = 2; i < nl; i++) {
free(v[i]);
}
nl = 2;
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
并打印“旧”值,它似乎什么也没做,因为旧值可能仍然存在(释放并不意味着重置内存),但您现在可以访问未分配的数据:执行另一次分配可以重用释放的数据并覆盖它。没有矩阵(又名2D阵列)在您的代码中。int**
不是2D数组,不能指向一个数组或表示一个数组。为什么要释放内存?只是不要使用所有空间。部分释放几乎没有任何好处,您只需要帧内存空间。我明白您的意思。但是如果您有10000个元素这样的大行,并且调整大小到4000个元素,那么它可能是int重新设置是因为您将有空间放置另一个类似这样的“矩阵”,并且在realloc
过程中不会有任何内存副本。内存是碎片化的,但矩阵也是碎片化的。这取决于调整大小前后行大小的差异。没有矩阵(也称为2D数组)在您的代码中。int**
不是2D数组,不能指向一个数组或表示一个数组。为什么要释放内存?只是不要使用所有空间。部分释放几乎没有任何好处,您只需要帧内存空间。我明白您的意思。但是如果您有10000个元素这样的大行,并且调整大小到4000个元素,那么它可能是int因为你会有空间再放一个“矩阵”像这样,在realloc
过程中不会有任何内存拷贝。内存是碎片化的,但矩阵也是碎片化的。这取决于调整大小前后行大小的差异。我确实这样做了,在尝试打印矩阵后,它们仍然没有释放。唯一发生的事情是第三行a上的前两个元素我们现在是0,所以我想这是唯一被释放的东西。所有的事情都是在同一时间仔细检查你的打印例程。也许它读取了数组的结尾并造成了混乱。@Andrei:即使未分配,数据仍然存在,直到另一个分配将其破坏。我确实这样做了,在尝试打印矩阵之后,t嘿,仍然没有释放。唯一发生的事情是第三行的前两个元素现在是0,所以我想这是唯一释放的事情。所有事情都是在同一时间仔细查看打印例程。可能是读取数组的结尾并造成混乱。@Andrei:即使未分配,数据仍然存在,直到其他的分配会把它们搞糟。