C中str == NULL和str =='\ 0'有什么区别?

我想知道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。

记住str并不是一个“string”,而是存储char (string的一部分)的内存位置的指针

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

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

char *void * 这告诉编译器这些是指针types(这是一个奇怪的方式,说这种types的variables不具有值,他们只是指向它)。 所以当编译器看到char *str ,它知道你可能会要求做类似*strstr[0]的东西(它们都做同样的事情)。 稍后我们将回到这个问题。

你看,当你在C程序中写入str时,编译器知道一个名为“str”的variables存储在一个存储单元中,例如0x0001。 它生成的代码将转到0x0001并获取该值。 这样,如果你做了这样的事情

 str + 1 

然后编译器会生成如下所示的代码:

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

我确信你知道这一点。 所以现在应该很明显这条线说:

 str == NULL 

由于NULL是一个空指针常量,因此该行testingstr是否为空指针(即,指向任何内容的指针)。

所以编译器通常会生成这样的代码:

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

现在请记住,如果你愿意,我们告诉编译器, str是一个真正的指针types。 所以我们可以写这个:

 *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得到值。 请注意,编译器并不在意string是否真的存储在那里。

(我假设你知道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是否指向一个空string (实际上是指向一个保存为0的内存位置)。

(根据定义,“string”是一个连续的字符序列,由第一个空字符结尾,所以如果string的第一个字符是'\0' ,那么这个string是一个空string。

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

str[0]=='\0'告诉你该string是否为零长度。

在该代码中,testing:

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

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


请注意,短路在这里起着关键作用:testing的重点是确保str是一个长度至less为1的有效Cstring。

  • 第二个testingstr[0] == '\0'只有在str不为NULL时才能使用。
  • 因此,当str为NULL时,需要第一次testingstr == NULL NULL。

实质上

  • str == NULL确定str是否是一个NULL指针
  • str[0] == '\0'确定str是否为0长度的c风格string

当你把它们合并在一起时,你正在检查它是NULL还是空的。 这允许函数在方法开始时消除两种forms的空数据

str == NULL检查str是否为空指针(指向无处)

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

str==NULL告诉你该string是否为NULL

*str=='\0'告诉你该string是否为零。

注意 :这个答案是在神秘的15秒的回答 ,其中有str=='\0' 。 当然,前3到4分钟内所做的更改没有显示出来,他将其固定了。

str == NULL意味着“str指向内存地址零”(或任何地址是NULL在您的系统上)。 通常这意味着根本没有string。

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

在其他语言中,你可能会写str == null vs str == "" 。 他们是指两个不同的东西。 理解C中的差别尤其重要,因为试图使用NULL指针会使程序崩溃。

str == NULL表示该string没有任何参考,因为它的指针是空的(意味着string的地址为空)。

str[0] == '\0' – 表示长度为0的string。

请让我知道,如果有任何错误的解释,或者你还有疑问。

 str == NULL 

意味着str不指向任何地址=指针是空的。

str[0] == '\0' 0'str是指向一个有效的地址,这一行检查第一个字符(即str [0])是数字0(ascii值'\ 0')这意味着string的结尾。 那么string是空的。 (str中没有字符:第一个是结束字符)

1 – > str == NULL确定str是否为NULL指针2 – > str[0] == '\0'确定str是否为0长度c style string

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

相当于C#的是:

 if (string.IsNullOrEmpty(str)) { } 

简单的含义是string是NULL还是空string。