非空参数与 C 中的 NULL 相比



在以下函数中,该函数旨在释放分配给类型为 Maze 的指针的一些内存,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而是使用悬空指针,从而导致未定义的行为。只是不要做双免费。

相关内容

  • 没有找到相关文章