我使用双指针创建了一个二维矩阵:
int** pt; pt = (int*) malloc(sizeof(int)*10);
我知道指针被释放了
free(ptr);
我们如何释放双指针?
如果我们打印一些内容然后释放内存并退出程序怎么办?最终记忆是否包含我们使用的记忆或与初始记忆相同?
答案 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)
如果您的矩阵没有“参差不齐”,即所有行的长度都相同,您可能需要考虑:
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
之前检查是否有失败。