c自由指向结构的指针

c自由指向结构的指针,c,pointers,structure,free,ansi,C,Pointers,Structure,Free,Ansi,我在用普通C写,我有一个关于如何释放指向结构的指针的问题。 我用以下方式声明了一个结构 typedef struct _RealMatrix { uint nRows; uint nCols; real **matrix; } RealMatrix; 现在,每当我需要它时,我都使用下面的代码来分配它 RealMatrix *realMatrixAlloc(uint n, uint m) { loop_var(i); RealMatrix *matrix;

我在用普通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;
}
哪个会

free((*ma)->matrix[0]),
free((*ma)->matrix)
free(*ma).
*ma = NULL;
使用适当的检查,以避免跟随任何空指针。这里“ma”是指向结构的指针:函数声明读取

void freeRealMatrix(RealMatrix **ma);
然而,当这个函数返回时,我发现“myRealMatrix”仍然在处理一个现有的结构,它并没有像我预期的那样被free(*ma)释放。另一方面,阵列(*ma)->矩阵已成功释放

你知道我做错了什么吗?这让我快发疯了。。。 提前谢谢

更新:


我复制了代码并在一个全新的程序中执行。。。它的工作原理与预期完全一致。我注意到“myRealMatrix”中包含的地址与*ma所指的地址不同。好。。。有点:它似乎被截断了!它不是0x106a50,而是0x106a,不再是了。最后两个十六进制数字每次都会丢失

释放后,指针继续包含释放位置的地址。但是,您不能继续寻址此位置。它可以用来做其他事情

您可能希望在第三个free语句之后显式将其设置为NULL:

*ma = NULL;

但是,当此函数返回时,我发现“myRealMatrix”仍在寻址现有结构
如何?
释放
对释放的内存没有任何作用,只是将其返回供程序稍后使用-尤其是,您没有理由看到返回的内存有任何差异。你不能再使用它了。您希望更改什么?在调用
free
时不需要检查
NULL
-调用
free(0)
是安全的。不过,你应该确保你没有尝试去引用一个,阅读你的问题,我不确定你的意思。对不起,忘了说:我希望在执行行*ma=NULL时,“myRealMatrix”会变成NULL(就在空闲(*ma)之后)。相反,“myRealMatrix”指向与以前相同的地址,并且nRows和nCols值相同。这对我来说似乎很奇怪…@gianluca-Carl Norum是正确的:“free不会对您释放的内存做任何事情,除非返回它供您的程序稍后使用-尤其是,您没有理由看到您返回的内存有任何差异。”。在三个“free()”之后显式地将指针设置为NULL是一个好主意。最后一个后,
*ma=NULL,您的调用者应该会看到
myRealMatrix==NULL
。是的,我希望。。。然而,即使在执行*ma=NULL之后,我也看不到myRealMatrix值有任何变化。嗯,我一定是把事情搞砸了…好吧,我复制了代码并在一个全新的程序中执行。。。它的工作原理与预期完全一致。我注意到“myRealMatrix”中包含的地址与*ma所指的地址不同。好。。。有点:它似乎被截断了!它不是0x106a50,而是0x106a,不再是了。最后两个十六进制数字每次都会丢失!
*ma = NULL;