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