我使用这样的双指针创建了一个二维矩阵:
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*)
,因为您正在分配指向 s 的指针int
,而不是int
s - 和的大小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 * sizeof **p);
double *e1 = (double *) (p + height);
size_t i;
for(i = 0; i < height; ++i)
p[i] = e1 + i * width;
return p;
}
注意:以上内容未经测试,生产代码在使用p
.