c 指向结构的自由指针

问题描述 投票:0回答:1

我正在用纯 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,仅此而已。每次都缺少最后两个十六进制数字!

c pointers structure free ansi-c
1个回答
3
投票

释放后,您的指针继续包含释放位置的地址。但是,您不能继续解决此位置。它可以用于其他用途。

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

*ma = NULL;
© www.soinside.com 2019 - 2024. All rights reserved.