0

我有一个指针char *str;

对于特定情况,if (!str)不是 NULL 而是str[0] == '\0',这如何以及何时可能?

编辑:0 感谢所有回复。基本上我需要将此字符串作为源参数传递,strlcpy()其中存在下垂故障,因为这是一个空字符串。看来我需要这样的检查:if (!str || str[0] == '\0')而不是传递给 strlcpy()。听起来对吗?

4

6 回答 6

1

str[0] == '\0'用于表示一个空字符串——长度为 0 的字符串。

于 2012-06-04T18:28:30.750 回答
1

\0是空字节或空终止符。因此,它被视为空值。C 字符串以空值结尾。也就是说,第一次看到空字节时,字符串被认为是完整的。如果不\0存在其他任何东西,它就是NULL

如果您有超出此字节的信息(这对字符串来说是不好的做法),您可以尝试检查str+1哪些将提前通过空字节。无论如何,str+1等等很可能是垃圾数据并导致无效的内存访问(导致您的程序崩溃)。

于 2012-06-04T18:29:44.110 回答
1

NULLstr 中的有效(非)指针指向包含单个\0字符的内存地址时,这是可能的。

于 2012-06-04T18:31:12.753 回答
1
char *str = "";

thenstr是一个指向空字符串的指针,它不是NULLbut *str == str[0] == 0

于 2012-06-04T18:31:46.450 回答
1

str在内存中保存一个地址 - a 的地址char

(!str)只有当 str 的值不是时才会返回 false NULL。换句话说,当 str 没有引用 addressNULL时,这是一个不可用的内存地址。

*str包含一个char. 当str 指向的字符NULL时,则(str[0] == '\0')返回 true:str 指向的是空字符串。

于 2012-06-04T18:32:42.563 回答
1

您正在处理两件事:

首先, char *str 是一个指针。如果它为 NULL,则它没有指向有效内存,并且您不能将其取消引用为str[0]*char

其次,str[0]== '\0'`表示你有一个指向有效内存的指针,str所指向的内存中字符串的第一个位置是'\0',一个字符串终止符。

于 2012-06-04T18:34:30.287 回答