我使用双指针创建了一个二维矩阵,代码如下:
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
的大小不能保证相同。
对于第一个问题,我会告诉你一个经验法则。
你调用free()
的次数应该等于你调用malloc()
和calloc()
的次数之和。
所以,如果你按照这样的方式分配了一个指向指针的指针,然后在每个指向整数的指针上使用了malloc()
,那么你将释放“行”次,其中每个free()
都是为每个指向整数的指针而释放的。
最后,在指向指针的指针上调用一次free()
。这将平衡malloc()
+ calloc()
与free()
的调用次数。
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
之前检查失败。double *
数组和一个大小为width * height
的double
二维数组分配空间。为什么不是malloc(height * sizeof(double *) + width * height * sizeof(double)
?你的malloc中的+ width * height
部分只会为矩阵中每个double
分配一个字节的空间,这不足够。 - Michael Dorstfree()
语句;@MichaelDorst,你是指这个吗?len = sizeof(int *) * rows + sizeof(int) * columns * rows;
和 arr = (int **)malloc(len);
。在这种情况下,我想知道如何释放这个双指针。 - vincent thorpe
malloc
。代码在哪里? - Eitan Tmalloc()
、realloc()
或calloc()
的调用结果进行强制类型转换 - 这是不必要的,且可能会掩盖一个严重错误,即缺少原型。 - mlp