在C中,似乎有零各个值之间的差- NULL,NUL和0.
我知道ASCII字符的'0'计算结果为48或0x30.
该NULL指针通常定义为:
#define NULL 0
Run Code Online (Sandbox Code Playgroud)
要么
#define NULL (void *)0
Run Code Online (Sandbox Code Playgroud)
另外,也有似乎评价的NUL人物.'\0'0
是否有时候这三个值不相等?
这在64位系统上也是如此吗?
假设NULL在C 中始终转换为false 是否安全?
void *somePtr = NULL;
if (!somePtr) {
/* This will always be executed? */
}
Run Code Online (Sandbox Code Playgroud)
或者应该明确检查价值NULL?
在我的GCC测试程序中,NULL似乎为零,但维基百科说NULL只需指向无法寻址的内存.
有没有编译器NULL非零?我很好奇是否if (ptr == NULL) 更好的做法if (!ptr).
我隐约记得几年前读过这篇文章,但我在网上找不到任何参考.
你能给我一个NULL宏没有扩展到0的例子吗?
编辑清晰:今天,它扩展为((void *)0),(0)或(0L).但是,有些架构早已被遗忘,而这种情况并非如此,并且NULL扩展到了不同的地址.就像是
#ifdef UNIVAC
#define NULL (0xffff)
#endif
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样一台机器的例子.
更新以解决问题:
我不是在现行标准的背景下提出这个问题,也不是用不正确的术语来扰乱人们.但是,我接受的答案证实了我的假设:
后来的模型使用了[blah],显然是对所有现存的写得不好的C代码的反应,这些代码做出了错误的假设.
有关当前标准中的空指针的讨论,请参阅此问题.
在C++(gcc,VS)中,NULL被认为与False相同.或者更重要的是,如果在逻辑语句中,NULL评估为什么.还有许多其他问题,但C++没有具体问题.
由于某种原因,使用NULL控件循环(;;)只是冻结程序,指示在;;之间放置了除NULL之外的东西.请注意,此代码是我们的教授认为包含NULL值的代码.
是否有可能在C++ 03中可移植地散列指针,该指针尚未std::hash定义?
在C++中包含指针的hashables似乎很奇怪,但我想不出任何方法来制作它们.
我能想到的最接近的方式是做reinterpret_cast<uintptr_t>(ptr),但uintptr_t不需要在C++ 03中定义,我不确定这个值是否可以合法操纵,即使它被定义了......这是否可能?