释放一个双指针

时间:2012-06-13 12:58:44

标签: c pointers

我使用双指针创建了一个二维矩阵:

int** pt; pt = (int*) malloc(sizeof(int)*10);

我知道指针被释放了

free(ptr);

我们如何释放双指针?

如果我们打印一些内容然后释放内存并退出程序怎么办?最终记忆是否包含我们使用的记忆或与初始记忆相同?

2 个答案:

答案 0 :(得分:31)

假设你有一个矩阵mat

int** mat = malloc(10 * sizeof(int*));
for (int i=0; i<10; ++i) {
  mat[i] = malloc(10 * sizeof(int));
}

然后你可以释放矩阵的每一行(假设你事先正确地初始化了每一行):

for (int i=0; i<10; ++i) {
  free(mat[i]);
}

然后释放顶级指针:

free(mat);

对于您的第二个问题:如果您分配内存并使用它,您将更改该内存,即使您将其释放也不会“恢复”(尽管您将无法再可靠地/可移植地访问它)

注意:顶级malloc正在使用sizeof(int*),因为您要分配指针到int,而不是int s - 大小int*int并不保证是相同的。

答案 1 :(得分:2)

如果您的矩阵没有“参差不齐”,即所有行的长度都相同,您可能需要考虑:

  1. 手动访问它,即只将其视为一维值数组,并保持单独的width值。要访问( x,y )处的元素,请使用mat[y * width + x]
  2. 如果你真的想要mat[y][x]的方便,你可以通过调用malloc()来分别指针指针数组和所有行来改进它,然后初始化指针指向每一行。这样做的好处是它可以全部免费:只需free(mat);次呼叫即可。
  3. 第二种方法看起来像这样:

    double ** matrix_new(size_t width, size_t height)
    {
      double **p = malloc(height * sizeof *p + width * height);
      double *e1 = (double *) (p + height);
      size_t i;
    
      for(i = 0; i < height; ++i)
        p[i] = e1 + i * width;
      return p;
    }
    

    注意:以上内容未经过测试,生产代码显然应在使用p之前检查是否有失败。