在C中str == NULL和str [0] =='\ 0'之间有什么区别?

时间:2011-11-30 05:13:40

标签: c pointers gcc cstring

我想知道str == NULLstr[0] == '\0'之间的区别:

int convert_to_float(char *str, double *num)
{
    if ((str == NULL) || (str[0] == '\0'))
        return(-1);

    *num = strtod(str, (char **)NULL);
    return(0);
}

我在Linux上使用gcc。

10 个答案:

答案 0 :(得分:109)

str==NULL告诉您指针是否为NULL。

str[0]=='\0'告诉您字符串是否为零长度。

在该代码中,测试:

if ((str == NULL) || (str[0] == '\0'))

用于捕获NULL为零或长度为零的情况。


请注意,短路在这里起着关键作用:测试的目的是确保str是长度至少为1的有效c字符串。

  • 第二个测试str[0] == '\0'仅在str不为NULL时才有效。
  • 因此,当str == NULL为NULL时,需要第一次测试str才能提前爆发。

答案 1 :(得分:46)

重要的是要记住str不是真正的“字符串”,而是指针到内存位置char(a的一部分)字符串)存储。

接下来,我们必须了解编译器如何看待所有这些项目。我们来看看他们的类型:

  • str的类型为char *(字面意思是“指向char的指针”)
  • NULL是一个空指针常量(至少在我的系统上,它是((void*)0)
  • '\0'是一个字符常量(它实际上是int类型,但不要担心;它通常用于需要char值的上下文中)

请参阅*char *中的void *?这告诉编译器这些是指针类型(这是一种奇特的方式,说这种类型的变量不保持值,他们只是指向它)。因此,当编译器看到char *str时,它知道您可能会要求执行*strstr[0]之类的操作(这两者都做同样的事情)。我们稍后会再回过头来看。

您可以看到,当您在C程序中编写str时,编译器知道名为“str”的变量存储在内存位置,例如0x0001。它生成的代码转到0x0001并获取值。这样,如果你做了像

这样的事情
str + 1

然后编译器将生成类似于:

的代码
fetch the value from where str is stored (0x0001)
add 1 to that value

我确定你知道这件事。所以现在应该明白这条线说的是什么:

str == NULL

由于NULL是一个空指针常量,该行测试str是否为空指针(即指向不指向任何内容的指针)。

因此编译器通常会生成如下代码:

fetch the value from where str is stored
check if that value is 0

现在请记住,如果您愿意,我们告诉编译器str实际上是指针类型。所以我们允许写这个:

*str

这使得编译器生成了这个:

fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there

因此,如果str保持0x0200,那么我们将从内存地址0x0200获取值。请注意,编译器并不关心字符串是否真正存储在那里。

(我假设你知道str[0]*str相同。这样可以更容易地解释发生了什么。)

那怎么样呢?

*str == '\0'

这条线实际上是这样的:

*str == (char) 0

这使得编译器生成了这个:

fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0

总结:

  • str == NULL会告诉您指针str 是否指向
  • *str == '\0'会告诉您指针str是否指向空字符串(实际上,指向一个保持零的内存位置)。

(根据定义,“字符串”是“由第一个空字符终止并包含第一个空字符的连续字符序列”,因此如果字符串的第一个字符为'\0',则字符串为空字符串。)

答案 2 :(得分:27)

基本上

  • str == NULL确定str是否为NULL指针
  • str[0] == '\0'确定str是否为0长度c样式字符串

组合它们时,您正在检查它是NULL还是空。这允许函数在方法开始时消除两种形式的空数据

答案 3 :(得分:8)

str == NULL检查str是NULL指针(指向无处的指针)

str[0] == '\0'(如果不是NULL指针)检查第一个str元素有0值(没有字符的字符串只有0终止)

答案 4 :(得分:7)

str==NULL告诉您字符串是否为NULL

*str=='\0'告诉您字符串是否为零长度。

注意 :此答案是Mystical's 15 second answer上有str=='\0'的游戏。当然,在前3或4分钟内所做的更改没有显示,他修正了ಠ_ಠ。

答案 5 :(得分:6)

str == NULL表示“str指向内存地址零”(或者系统上的任何地址为NULL)。通常这意味着根本没有字符串。

str [0] =='\ 0'表示“str的第一个字符是字符零”(表示字符串的结尾)。这意味着有一个字符串,但它是空的。想想空杯子而不是杯子;同样的想法。

在其他语言中,您可以撰写str == null vs str == ""。它们意味着两件事。理解C中的差异尤为重要,因为尝试使用NULL指针会使程序崩溃。

答案 6 :(得分:4)

str == NULL这意味着字符串没有字符串的参考,因为它的指针是Null(表示字符串的地址为空)。

str[0] == '\0' - 表示长度为0的字符串。

如果这个解释有任何问题或者您仍有疑问,请告诉我。

答案 7 :(得分:3)

str == NULL 

表示str未指向任何地址=指针为空。

str[0] == '\0' str指向一个有效的地址,此行检查第一个字符(即str [0])是否为数字0(ascii值为'\ 0'),表示结束字符串。然后字符串是空的。 (str中没有字符:第一个是结束字符)

答案 8 :(得分:2)

1 - > str == NULL确定str是否为NULL指针 2 - > str[0] == '\0'确定str是否为0长度c样式字符串

所以在这 if ((str == NULL) || (str[0] == '\0')) OR运算符的短路进入图像,因为它确保字符串不指向任何字符串或空字符串..

答案 9 :(得分:0)

C#相当于:

if (string.IsNullOrEmpty(str))
{

}

简单的含义是字符串是NULL还是空字符串。