我有一个指针char *str;
对于特定情况,if (!str)
不是 NULL 而是str[0] == '\0'
,这如何以及何时可能?
编辑:0
感谢所有回复。基本上我需要将此字符串作为源参数传递,strlcpy()
其中存在下垂故障,因为这是一个空字符串。看来我需要这样的检查:if (!str || str[0] == '\0')
而不是传递给 strlcpy()。听起来对吗?
str[0] == '\0'
用于表示一个空字符串——长度为 0 的字符串。
\0
是空字节或空终止符。因此,它被视为空值。C 字符串以空值结尾。也就是说,第一次看到空字节时,字符串被认为是完整的。如果不\0
存在其他任何东西,它就是NULL
。
如果您有超出此字节的信息(这对字符串来说是不好的做法),您可以尝试检查str+1
哪些将提前通过空字节。无论如何,str+1
等等很可能是垃圾数据并导致无效的内存访问(导致您的程序崩溃)。
当NULL
str 中的有效(非)指针指向包含单个\0
字符的内存地址时,这是可能的。
char *str = "";
thenstr
是一个指向空字符串的指针,它不是NULL
but *str == str[0] == 0
。
str
在内存中保存一个地址 - a 的地址char
。
(!str)
只有当 str 的值不是时才会返回 false NULL
。换句话说,当 str 没有引用 addressNULL
时,这是一个不可用的内存地址。
*str
包含一个char
. 当str 指向的字符为NULL
时,则(str[0] == '\0')
返回 true:str 指向的是空字符串。
您正在处理两件事:
首先, char *str 是一个指针。如果它为 NULL,则它没有指向有效内存,并且您不能将其取消引用为str[0]
或*char
。
其次,str[0]
== '\0'`表示你有一个指向有效内存的指针,str所指向的内存中字符串的第一个位置是'\0',一个字符串终止符。