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

时间:2017-10-23 17:40:00

标签: c memory malloc

在以下函数中,用于释放分配给SharedPreferences studentNumber类型指针的一些内存,其中Maze是我在另一个文件中定义的结构。

我收到编译错误Maze 这只是一个警告,但我不得不打开警告。

以下是该函数的代码:

nonnull argument 'maze' compared to NULL

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

1 个答案:

答案 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,而是使用悬空指针,从而导致未定义的行为。不要双重自由。