非空参数与 C 中的 NULL 相比

2023-12-20

在下面的函数中,设计用于释放分配给类型指针的一些内存Maze with Maze是我在另一个文件中定义的结构。

我收到编译器错误nonnull argument 'maze' compared to NULL这只是一个警告,但我不得不打开警告。

这是该函数的代码:

void free_maze(Maze *maze) {
    if (maze == NULL) {
        return;
    }

    free(maze);
    return;
}

据我了解,这是检查指向结构的指针是否为 NULL 的正确方法。我在这里做错了什么?


警告的原因可能是声明free_maze看起来与此类似:

extern void free_maze (Maze *maze)
        __attribute__((nonnull));

__attribute__((nonnull));是 GCC 特定的扩展。

所以声明说NULL永远不应该传递给free_maze。编译器将尝试检测违反此约束的情况并警告您。由于您不应该传递 NULL,因此检查它没有什么意义。

即使没有属性,您也不需要检查,因为free(NULL)保证安全。

关于您的编辑:致电

free(maze);

没有改变maze在调用者的范围内。如果你不小心打电话free再次使用相同的指针,第二次调用将不会NULL但有一个悬空指针,导致未定义的行为。只是不要做双重释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非空参数与 C 中的 NULL 相比 的相关文章

随机推荐