C语言 释放双指针

laik7k3q  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(157)

我用双指针创建了一个二维矩阵,如下所示:

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

我知道指针是这样释放的

free(ptr);

我们怎样才能释放双指针呢?
如果我们打印了一些东西,然后释放了内存并退出程序,最终内存是由我们使用过的内存组成的,还是和初始内存一样?

dhxwm5r4

dhxwm5r41#

假设有一个矩阵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--int*int的大小不能保证相同。
1l5u6lss

1l5u6lss2#

如果您的矩阵不是“参差不齐”的,即所有行的长度都相同,您可能需要考虑:
1.手动访问,即只把它当作一个一维数组值,并保留一个单独的width值。要访问位于(x,y)的元素,使用mat[y * width + x]
1.如果你真的想要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之前,生产代码显然应该检查失败。

rpppsulh

rpppsulh3#

对于第一个问题,我会告诉你经验法则。
调用free()的次数应该等于调用malloc()的次数+调用calloc()的次数。
所以如果你用这样的方式分配,你创建了一个指向int的指针,然后在每个指向int的指针上使用malloc(),那么你将释放“行”的次数,其中每个free()对应于每个指向int的指针。
最后一个free()是在指向int的指针上调用的,这将平衡malloc() + calloc()free()调用。

相关问题