释放一个双指针

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

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

我知道指针被释放了

 free(ptr); 

我们如何释放双指针?

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

假设你有一个矩阵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的大小不保证是相同的。

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

  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); double *e1 = (double *) (p + height); size_t i; for(i = 0; i < height; ++i) p[i] = e1 + i * width; return p; } 

注意:以上是未测试的,生产代码显然应该在使用p之前检查是否有故障。