我正在阅读Cracking the Coding访谈(Q 1.2)一书中的问题解决方案.目标是void revers(char* str)
在C中实现一个反转空终止字符串的函数.
解决方案代码如下所示:
void reverse(char *str)
{
char* end=str;
char tmp;
if(str)
{
while(*end)
{
end++;
}
end--;
//code to reverse
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,str
包含一个地址吧?而if(str)
仅评估为false
,如果str
是0
,对不对?
所以,我要说的是,有没有机会,str
将包含地址0x0000
,从而评估if(str)
来false
?
Jon*_*Jon 14
str
确实包含一个地址(它是一个指针char
),如果它等于空指针,if(str)
它将计算为false .str
注意,标准不要求空指针来引用地址0
; 但是,一个标准的任务文本值的0
一个指针上下文中使用时,必须由编译器解释为空指针的地址-不管它可能是.
这意味着测试if(p == 0)
保证始终与测试相同if(p == NULL)
.此外,条件if(p)
保证始终与...相同if(p != 0)
.
结论:您的代码将始终检测到空指针,但这在技术上与指向零地址的指针不同(即使在实践中您会发现它通常是).
if(str)
Run Code Online (Sandbox Code Playgroud)
等价于
if(str != NULL)
Run Code Online (Sandbox Code Playgroud)
要么
if(str != 0)
Run Code Online (Sandbox Code Playgroud)
该测试不是测试str
地址0
是否str
为,而是测试是否为空指针。
请注意,空指针不必具有地址0
,该标准仅确保空指针与任何其他非空指针不相等。
C11 6.3.2.3 指针
一个值为0的整数常量表达式,或将这种类型强制转换为void *类型的表达式称为空指针常量。66)如果将空指针常量转换为指针类型,则生成的指针称为空指针。保证比较不等于指向任何对象或函数的指针。