Oli*_*rth 57
我假设你的意思是空指针.保证比较等于0.1 但它不必用全零位表示.2
另请参见有关空指针的comp.lang.c常见问题解答.
Joh*_*ode 13
空指针常量始终为0. NULL宏可以由实现定义为裸0,或类似的转换表达式(void *) 0,或者某些其他零值整数表达式(因此标准中的"实现定义"语言).
空指针值可以是0以外的值.当遇到空指针常量时,它将被转换为正确的空指针值.
joh*_*nes 11
C99标准的第6.3.2.3节说
值为0的整型常量表达式或类型为void*的表达式称为空指针常量.如果将空指针常量转换为指针类型,则保证结果指针(称为空指针)比较不等于指向任何对象或函数的指针.
§7.17也说
[...] NULL,扩展为实现定义的空指针常量[...]
NULL指针的地址可能与0不同,而它的行为与大多数情况下的相同.
(这应该与我现在没有的旧C标准相同)
在C中,有一个且只有一个上下文,其中有必要将空指针常量显式地转换为特定指针类型,以便程序正常运行.该上下文通过无类型函数参数列表传递空指针.在现代 C中,只有在需要将空指针传递给接受可变数量参数的函数时才会发生这种情况.(在遗留C中,它发生在未使用原型声明的任何函数中.)范例示例是execl,最后一个参数必须是显式转换为的空指针(char *):
execl("/bin/ls", "ls", "-l", (char *)0); // correct
execl("/bin/ls", "ls", "-l", (char *)NULL); // correct, but unnecessarily verbose
execl("/bin/ls", "ls", "-l", 0); // undefined behavior
execl("/bin/ls", "ls", "-l", NULL); // ALSO undefined behavior
Run Code Online (Sandbox Code Playgroud)
是的,那最后一个例子是未定义行为即使 NULL被定义为((void *)0),因为void *和char *是不是在通过非类型化的参数列表传递隐含互相转化的,即使他们是在其他地方.
"引擎盖下",这里的问题是不是只是用于空指针的位模式,但编译器可能需要知道确切的具体类型每个参数,以便正确地建立呼叫帧.(考虑MC68000,以其独立的地址和数据寄存器;指定指针参数一些ABI在地址寄存器,但数据寄存器整数参数传递也考虑任何ABI在哪里.int而且void *是不一样的大小,它是难以觉察罕见时下,但. C仍然明确规定void *并且char *不是相同的大小.)如果有一个函数原型,编译器可以使用它,但是非原型函数和可变参数不提供这样的帮助.
C++更复杂,我觉得没有资格解释如何.
| 归档时间: |
|
| 查看次数: |
33904 次 |
| 最近记录: |