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
我该怎么做?

您必须:

  • 在前两行之后释放整行(并将
    nl
    设置为2):
像这样:

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
并打印“旧”值,它似乎什么也没做,因为旧值可能仍然存在(释放并不意味着重置内存),但您现在可以访问未分配的数据:执行另一次分配可以重用释放的数据并覆盖它。

您必须:

  • 在前两行之后释放整行(并将
    nl
    设置为2):
像这样:

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:即使未分配,数据仍然存在,直到其他的分配会把它们搞糟。