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

joh*_*ohn 52 c gcc pointers 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);
}
Run Code Online (Sandbox Code Playgroud)

我在Linux上使用gcc.

Mys*_*ial 109

str==NULL 告诉你指针是否为NULL.

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

在该代码中,测试:

if ((str == NULL) || (str[0] == '\0'))
Run Code Online (Sandbox Code Playgroud)

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


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

  • 第二个测试str[0] == '\0'只有在str不为NULL 时才有效.
  • 因此,str == NULLstrNULL为NULL 时,需要进行第一次测试.

  • 如果您打印它,则为零长度.实际上它可以为它分配更多的空间. (13认同)
  • @Nawaz:零长度意味着`strlen(str)== 0`. (11认同)
  • @Mysticial我会说,因为你说"检查字符串是否为NULL".它是一个指针,你描述它的方式听起来有点不清楚.我也没有投票.我也不知道为什么这个答案被低估了.让我为你补偿那些downvotes :) (2认同)

Sha*_*mer 46

重要的是要记住,str它实际上不是"字符串",而是指向存储char(字符串的一部分)的内存位置的指针.

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

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

看到*in char *void *?这告诉编译器这些是指针类型(这是一种奇特的方式,说这种类型的变量不保持值,他们只是指向它).所以编译器看到时char *str,它知道你可能会问到这样做*strstr[0](两者做同样的事情).我们稍后会再回过头来看看.

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

str + 1
Run Code Online (Sandbox Code Playgroud)

然后编译器将生成类似于以下内容的代码:

fetch the value from where str is stored (0x0001)
add 1 to that value
Run Code Online (Sandbox Code Playgroud)

这是我确定你知道的.所以现在应该明白这条线说的是:

str == NULL
Run Code Online (Sandbox Code Playgroud)

由于NULL是一个空指针常量,该行测试是否str为空指针(即,指针不指向任何东西).

所以编译器通常会生成如下代码:

fetch the value from where str is stored
check if that value is 0
Run Code Online (Sandbox Code Playgroud)

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

*str
Run Code Online (Sandbox Code Playgroud)

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

fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there
Run Code Online (Sandbox Code Playgroud)

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

(我假设你知道它str[0]是一样的*str.它可以更容易地解释发生了什么.)

那怎么样呢?

*str == '\0'
Run Code Online (Sandbox Code Playgroud)

所以这条线实际上是:

*str == (char) 0
Run Code Online (Sandbox Code Playgroud)

这使编译器生成这个:

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
Run Code Online (Sandbox Code Playgroud)

总结一下:

  • 写作会str == NULL告诉您指针str 是否指向任何内容.
  • 写入会*str == '\0'告诉您指针str是否指向空字符串(实际上,指向保持为零的内存位置).

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


Jar*_*Par 27

实质上

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

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

  • +1关键字是"指针"......其他答案都没有 (5认同)
  • 另外:如果它是NULL,你就不能取消引用str ..这就是为什么需要先对NULL进行测试.第二个测试是检查str指向的内存位置中的值. (2认同)

tri*_*san 8

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

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


Mat*_*ner 7

str==NULL告诉你字符串是否是NULL.

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

注意:这个答案是一出戏神秘的15个第二个回答其中有str=='\0'.当然,在前3或4分钟内所做的更改没有显示,他修正了ಠ_ಠ.


Ren*_*ena 6

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

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

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