joh*_*ohn 52 c gcc pointers cstring
我想知道的区别str == NULL和str[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 == NULL当strNULL为NULL 时,需要进行第一次测试.Sha*_*mer 46
重要的是要记住,str它实际上不是"字符串",而是指向存储char(字符串的一部分)的内存位置的指针.
接下来,我们必须了解编译器如何看待所有这些项目.我们来看看他们的类型:
str属于类型char *(字面意思是"指向一个char")NULL是一个空指针常量(至少在我的系统上,它是((void*)0))'\0'是一个字符常量(它实际上是类型int,但不要担心;它通常用在需要char值的上下文中)看到*in char *和void *?这告诉编译器这些是指针类型(这是一种奇特的方式,说这种类型的变量不保持值,他们只是指向它).所以编译器看到时char *str,它知道你可能会问到这样做*str或str[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确定是否str是NULL指针str[0] == '\0'确定if str是否为0长度c样式字符串组合它们时,您正在检查它是NULL还是空.这允许函数在方法开始时消除两种形式的空数据
str == NULL 检查str是NULL指针(指向无处的指针)
str[0] == '\0' (如果不是NULL指针)检查第一个str元素有0值(没有字符的字符串只有0终止)
str==NULL告诉你字符串是否是NULL.
*str=='\0' 告诉你字符串是否为零长度.
注意:这个答案是一出戏神秘的15个第二个回答其中有str=='\0'.当然,在前3或4分钟内所做的更改没有显示,他修正了ಠ_ಠ.
str == NULL表示"str指向内存地址为零"(或者系统上的任何地址为NULL).通常这意味着根本没有字符串.
str [0] =='\ 0'表示"str的第一个字符是字符零"(表示字符串的结尾).这意味着有一个字符串,但它是空的.想想空杯子而不是杯子; 同样的想法.
在其他语言中你可能写str == nullVS str == "".它们意味着两件事.理解C中的差异尤为重要,因为尝试使用NULL指针会使程序崩溃.