我如何释放一个矩阵的某些行和列

问题描述:

所以我有创建这样一个矩阵:我如何释放一个矩阵的某些行和列

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

你的代码中没有矩阵(又名二维数组)。 'int **'不是二维数组,不能指向一个或代表一个。为什么你想释放内存?只是不要使用所有的空间。部分释放几乎没有获得任何东西,你只是分散存储空间。 – Olaf

+0

我明白你的观点。但是如果你有像10000个元素那样的大行,并调整到4000个元素,这可能很有趣,因为你可以为这样的另一个“矩阵”留出空间,并且在realloc过程中不会有任何内存副本。内存被分割,但矩阵也是如此。这取决于调整大小之前/之后的行大小差异。 –

你必须:

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

+0

我的确如此,在尝试打印矩阵之后,他们仍然没有释放。唯一发生的事情是,第三行的前2个元素现在为0,所以我想这是唯一被释放的东西。一切都是一样的 – Andrei

+1

时间更仔细一点看你的打印程序。也许它正在读取阵列的结尾并导致混乱。 –

+0

@Andrei:即使未分配,数据仍然存在,直到另一个分配破坏它们。 –