在C中,指针的地址可以为0吗?

Gro*_*Man 6 c pointers

我正在阅读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,如果str0,对不对?

所以,我要说的是,有没有机会,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).

结论:您的代码将始终检测到空指针,但这在技​​术上与指向零地址的指针不同(即使在实践中您会发现它通常是).


Yu *_*Hao 5

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)如果将空指针常量转换为指针类型,则生成的指针称为空指针。保证比较不等于指向任何对象或函数的指针。


Eld*_*mov 2

除非您传递指向该函数的NULL指针,否则不会有这样的机会。

C 中没有布尔类型,直到 C99 中引入它。任何逻辑运算(包括条件)都会检查值是否为零,无论其实际类型如何。