我有一个指针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等等很可能是垃圾数据并导致无效的内存访问(导致您的程序崩溃)。
当NULLstr 中的有效(非)指针指向包含单个\0字符的内存地址时,这是可能的。
char *str = "";
thenstr是一个指向空字符串的指针,它不是NULLbut *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',一个字符串终止符。