我正在用普通的 C 语言编写,我有一个关于如何释放指向结构的指针的问题。我有一个以下列方式声明的结构
typedef struct _RealMatrix {
uint nRows;
uint nCols;
real **matrix;
} RealMatrix;
现在,每次我需要它时,我都会使用以下代码来分配它
RealMatrix *realMatrixAlloc(uint n, uint m) {
loop_var(i);
RealMatrix *matrix;
matrix = malloc(sizeof(RealMatrix));
errcheck(matrix, "Unable to create real matrix structure.");
matrix->nRows = n;
matrix->nCols = m;
matrix->matrix = malloc(n*sizeof(real *));
matrix->matrix[0] = malloc(n*m*sizeof(real));
errcheck(matrix->matrix && matrix->matrix[0], "Unable to get requested memory for real matrix of dimensions: (%u, %u).", n, m);
f_i(i < n) matrix->matrix[i] = matrix->matrix[0] + i*m;
return matrix;
}
其中 errcheck() 是分配检查宏。一切正常,直到我尝试释放它调用
freeRealMatrix(&myRealMatrix);
这将
free((*ma)->matrix[0]),
free((*ma)->matrix)
free(*ma).
*ma = NULL;
进行适当的检查以避免跟随任何 NULL 指针。这里的“ma”是指向结构的指针:函数声明读取
void freeRealMatrix(RealMatrix **ma);
但是,当此函数返回时,我发现“myRealMatrix”仍在寻址现有结构,该结构没有像我预期的那样被 free(*ma) 释放。另一方面,数组 (*ma)->matrix 已成功释放。
关于我做错了什么的任何想法?这让我发疯......提前致谢!
更新:
我复制了代码并在一个全新的程序中执行......它按预期工作。我注意到“myRealMatrix”中包含的地址与 *ma 指向的地址不同。嗯......有点:它似乎被截断了!而不是 0x106a50,它只是 0x106a,仅此而已。每次都缺少最后两个十六进制数字!