在下面的函数中,设计用于释放分配给类型指针的一些内存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(使用前将#替换为@)