在以下函数中,用于释放分配给SharedPreferences studentNumber
类型指针的一些内存,其中Maze
是我在另一个文件中定义的结构。
我收到编译错误Maze
这只是一个警告,但我不得不打开警告。
以下是该函数的代码:
nonnull argument 'maze' compared to NULL
据我所知,这是检查指向结构的指针是否为NULL的正确方法。我在这里做错了什么?
答案 0 :(得分:8)
警告的原因可能是free_maze
的声明与此类似:
extern void free_maze (Maze *maze)
__attribute__((nonnull));
__attribute__((nonnull));
是特定于GCC的扩展程序。
因此声明说NULL
永远不应传递给free_maze
。编译器将尝试检测违反此约束的情况并发出警告。因为你不应该传递NULL,所以检查它是没有意义的。
即使没有属性,也不需要检查,因为free(NULL)
可以保证安全。
关于你的编辑:电话
free(maze);
不会在调用方范围内更改maze
。如果您不小心使用相同的指针再次调用free
,则第二次调用将不会使用NULL
,而是使用悬空指针,从而导致未定义的行为。不要双重自由。