指针-C中str == NULL和str [0] =='\ 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。

john asked 2020-01-13T08:12:00Z
10个解决方案
109 votes

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

str == NULL告诉您字符串是否为零长度。

在该代码中,测试:

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

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


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

  • 仅当str不为NULL时,第二个测试str == NULL才能工作。
  • 因此,当str为NULL时,需要较早推出第一个测试str == NULL
Mysticial answered 2020-01-13T08:14:31Z
46 votes

重要的是要记住'\0'并不是真正的“字符串”,而是指向str(字符串的一部分)存储位置的内存位置的指针。

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

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

看到strvoid *中的'\0'? 这告诉编译器它们是指针类型(这是一种奇特的说法,这种类型的变量不保存该值,它们只是指向该值)。 因此,当编译器看到char *str时,它知道您可能会要求做类似*strstr[0]的事情(两者都做同样的事情)。 我们稍后再讲。

您会看到,当您在C程序中编写'\0'时,编译器会知道一个名为“ str”的变量存储在一个内存位置,例如0x0001。 它生成的代码进入0x0001并获取值。 这样,如果你做类似的事情

str + 1

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

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

我确定你知道这件事。 所以现在很明显这行说了什么:

str == NULL

由于'\0'是空指针常量,因此该行测试str是否是空指针(即,不指向任何内容的指针)。

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

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

现在请记住,如果您愿意,我们告诉编译器'\0'实际上是指针类型。 所以我们可以这样写:

*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获得该值。 请注意,编译器实际上并不关心字符串是否确实存储在此。

(我假设您知道'\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

总结一下:

  • 编写'\0'会告诉您指针str是否没有指向任何对象。
  • 编写'\0'可以告诉您指针str是否指向空字符串(实际上,指向持有零的内存位置)。

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

Shalom Craimer answered 2020-01-13T08:13:44Z
27 votes

实质上

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

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

JaredPar answered 2020-01-13T08:15:04Z
8 votes

str[0] == '\0'检查str是NULL指针(无处指向)

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

triclosan answered 2020-01-13T08:15:29Z
7 votes

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

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

注意:此答案是Mystical的15秒答案中的一个结果,该答案为str=='\0'。当然,不会显示前3分钟或4分钟的更改,他将其固定为ಠ_ಠ。

Matt Joiner answered 2020-01-13T08:15:57Z
6 votes

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

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

用其他语言,您可能会写成str == nullstr == ""。它们表示两种不同的含义。 理解C的区别尤为重要,因为尝试使用NULL指针会使程序崩溃。

Rena answered 2020-01-13T08:16:27Z
4 votes

str[0] == '\0'这意味着该字符串没有字符串的引用,因为它的指针为Null(意味着字符串的地址为null)。

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

如果此说明有任何错误之处,否则请让我知道。

Sandy answered 2020-01-13T08:16:56Z
3 votes
str == NULL 

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

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

Hicham answered 2020-01-13T08:17:20Z
2 votes

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

所以在这个if ((str == NULL) || (str[0] == '\0'))OR运算符的短路会出现在图片中,因为它可以确保字符串不指向任何东西或指向空字符串。

Anshul garg answered 2020-01-13T08:17:45Z
0 votes

相当于C#的是:

if (string.IsNullOrEmpty(str))
{

}

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

Estefany Velez answered 2020-01-13T08:18:09Z
translate from https://stackoverflow.com:/questions/8321459/what-is-the-difference-between-str-null-and-str0-0-in-c