我用双指针创建了一个二维矩阵,如下所示:
int** pt; pt = (int*) malloc(sizeof(int)*10);
我知道指针是这样释放的
free(ptr);
我们怎样才能释放双指针呢?如果我们打印了一些东西,然后释放了内存并退出程序,最终内存是由我们使用过的内存组成的,还是和初始内存一样?
dhxwm5r41#
假设有一个矩阵mat
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);
关于你的第二个问题:如果您分配内存并使用它,您将更改内存,即使您释放它,也不会“恢复”(尽管您将无法再可靠地/可移植地访问它)。
sizeof(int*)
int
int*
1l5u6lss2#
如果您的矩阵不是“参差不齐”的,即所有行的长度都相同,您可能需要考虑:1.手动访问,即只把它当作一个一维数组值,并保留一个单独的width值。要访问位于(x,y)的元素,使用mat[y * width + x]。1.如果你真的想要mat[y][x]的便利性,你可以通过调用malloc()来分配指针数组和所有的行,然后初始化指针指向每一行,这样做的好处是可以通过一次free(mat);调用来释放所有的指针。第二种方法看起来像这样:
width
mat[y * width + x]
mat[y][x]
malloc()
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之前,生产代码显然应该检查失败。
p
rpppsulh3#
对于第一个问题,我会告诉你经验法则。调用free()的次数应该等于调用malloc()的次数+调用calloc()的次数。所以如果你用这样的方式分配,你创建了一个指向int的指针,然后在每个指向int的指针上使用malloc(),那么你将释放“行”的次数,其中每个free()对应于每个指向int的指针。最后一个free()是在指向int的指针上调用的,这将平衡malloc() + calloc()和free()调用。
free()
calloc()
3条答案
按热度按时间dhxwm5r41#
假设有一个矩阵
mat
然后你可以释放矩阵的每一行(假设你已经事先正确地初始化了每一行):
然后释放顶级指针:
关于你的第二个问题:如果您分配内存并使用它,您将更改内存,即使您释放它,也不会“恢复”(尽管您将无法再可靠地/可移植地访问它)。
sizeof(int*)
,因为您分配的是指向int
的指针,而不是int
--int*
和int
的大小不能保证相同。1l5u6lss2#
如果您的矩阵不是“参差不齐”的,即所有行的长度都相同,您可能需要考虑:
1.手动访问,即只把它当作一个一维数组值,并保留一个单独的
width
值。要访问位于(x,y)的元素,使用mat[y * width + x]
。1.如果你真的想要
mat[y][x]
的便利性,你可以通过调用malloc()
来分配指针数组和所有的行,然后初始化指针指向每一行,这样做的好处是可以通过一次free(mat);
调用来释放所有的指针。第二种方法看起来像这样:
注意:以上内容未经测试,在使用
p
之前,生产代码显然应该检查失败。rpppsulh3#
对于第一个问题,我会告诉你经验法则。
调用
free()
的次数应该等于调用malloc()
的次数+调用calloc()
的次数。所以如果你用这样的方式分配,你创建了一个指向int的指针,然后在每个指向int的指针上使用
malloc()
,那么你将释放“行”的次数,其中每个free()
对应于每个指向int的指针。最后一个
free()
是在指向int的指针上调用的,这将平衡malloc()
+calloc()
和free()
调用。