17

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

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

我知道一个指针是这样释放的

free(ptr);

我们如何释放双指针?

如果我们打印一些东西然后释放内存并退出程序怎么办?最终记忆是由我们使用的记忆组成还是与初始记忆相同?

4

2 回答 2

37

假设你有一个矩阵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*),因为您正在分配指向 s 的指针int,而不是ints - 和的大小int*int保证相同。

于 2012-06-13T13:03:21.450 回答
2

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

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

第二种方法看起来像这样:

double ** matrix_new(size_t width, size_t height)
{
  double **p = malloc(height * sizeof *p + width * height * sizeof **p);
  double *e1 = (double *) (p + height);
  size_t i;

  for(i = 0; i < height; ++i)
    p[i] = e1 + i * width;
  return p;
}

注意:以上内容未经测试,生产代码在使用p.

于 2012-06-13T13:13:05.633 回答