我已经编写了一些在 OS X 10.6 上运行的 C 代码,它恰好很慢,所以我使用 valgrind 来检查内存泄漏等。我在执行此操作时注意到的一件事:
如果我将内存分配给这样的二维数组:
double** matrix = NULL;
allocate2D(matrix, 2, 2);
void allocate2D(double** matrix, int nrows, int ncols) {
matrix = (double**)malloc(nrows*sizeof(double*));
int i;
for(i=0;i<nrows;i++) {
matrix[i] = (double*)malloc(ncols*sizeof(double));
}
}
然后检查矩阵的内存地址是0x0。
但是,如果我这样做
double** matrix = allocate2D(2,2);
double** allocate2D(int nrows, int ncols) {
double** matrix = (double**)malloc(nrows*sizeof(double*));
int i;
for(i=0;i<nrows;i++) {
matrix[i] = (double*)malloc(ncols*sizeof(double));
}
return matrix;
}
这很好用,即返回指向新创建内存的指针。
当我还有一个free2D函数来释放内存。它似乎没有正确释放。即指针仍然指向与调用free 之前相同的地址,而不是0x0(我认为这可能是默认值)。
void free2D(double** matrix, int nrows) {
int i;
for(i=0;i<nrows;i++) {
free(matrix[i]);
}
free(matrix);
}
我的问题是:我是否误解了 malloc/free 的工作方式?否则有人可以建议发生了什么?
亚历克斯