释放一个双指针
我使用双指针创建了一个二维矩阵:
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
的大小不保证是相同的。
如果您的矩阵没有“参差不齐”,即所有行的长度都相同,您可能需要考虑:
- 手动访问它,即将其视为一维值数组,并保持单独的
width
值。 要访问( x,y )处的元素,请使用mat[y * width + x]
。 - 如果你真的想要
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
之前检查是否有故障。