Nonnull参数与C中的NULL进行比较

Col*_*son 1 c memory malloc

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

我收到编译器错误nonnull argument 'maze' compared to NULL 这只是一个警告,但我被限制为打开警告.

这是函数的代码:

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

    free(maze);
    return;
}
Run Code Online (Sandbox Code Playgroud)

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

n. *_* m. 8

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

extern void free_maze (Maze *maze)
        __attribute__((nonnull));
Run Code Online (Sandbox Code Playgroud)

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

所以声明说不NULL应该传递给free_maze.编译器将尝试检测违反此约束的情况并发出警告.因为你不应该传递NULL,所以检查它是没有意义的.

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

关于你的编辑:一个电话

free(maze);
Run Code Online (Sandbox Code Playgroud)

不会改变maze调用者的范围.如果您不小心free使用相同的指针再次调用,则第二次调用将不会NULL带有悬空指针,导致未定义的行为.只是不要做双重免费.