gpt4 book ai didi

c - C 中的 NULL 是否需要/定义为零?

转载 作者:太空狗 更新时间:2023-10-29 16:18:52 26 4
gpt4 key购买 nike

NULL 在我的 GCC 测试程序中似乎为零,但维基百科说 NULL 只需要指向无法寻址的内存。

是否有任何编译器使 NULL 非零?我很好奇 if (ptr == NULL) 是否比 if (!ptr) 更好。

最佳答案

NULL保证为零,可能转换为 (void *) 1.

C99,§6.3.2.3,¶3

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.(55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

注释 55 说:

55) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant.

请注意,由于空指针规则的制定方式,您用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但 AFAIK只有少数非常深奥的平台利用了这个事实,这应该不是问题,因为要“看到”你应该进入 UB -land 的底层位模式。


因此,就标准而言,这两种形式是等价的(!ptr 等同于 ptr==0 由于 §6.5.3.3 ¶5,ptr==0 等同于 ptr==NULL ); if(!ptr)也很地道。

话虽这么说,我通常明确地写if(ptr==NULL)而不是 if(!ptr)为了更加清楚地表明我正在检查一个指针是否为空而不是某个 bool 值。


  1. 注意在 C++ 中 void *由于使用此类 NULL 的更严格的隐式转换规则,因此不能存在转换。很麻烦(您每次都必须将其显式转换为比较指针的类型)。

关于c - C 中的 NULL 是否需要/定义为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com