C语言 指向结构的自由指针

bvhaajcl  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(182)

我在用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)释放。另一方面,array(*ma)-〉matrix已经成功释放。
有什么想法我做错了什么吗?这让我快疯了...提前感谢!
更新:
我复制了代码并在一个全新的程序中执行...它完全按照预期工作。我注意到“myRealMatrix”中包含的地址与 *ma指向的地址不一样。嗯...有点:它似乎被截断了!而不是0x 106 a50,它只是0x 106 a,没有更多。最后两个十六进制数字每次都丢失!

ldioqlga

ldioqlga1#

在释放之后,你的指针继续包含释放位置的地址。但是你不能继续寻址这个位置。它可以用于其他的东西。
您可能希望在第三个free语句之后将其显式设置为NULL:

*ma = NULL;

相关问题