char*数组应该以'\ 0'或"\ 0"结尾?

And*_*sne 15 c null pointers

让我们说我们有一个char指针数组

char* array[] = { "abc", "def" };
Run Code Online (Sandbox Code Playgroud)

那到底应该放什么?

char* array[] = { "abc", "def", '\0' };
Run Code Online (Sandbox Code Playgroud)

要么

char* array[] = { "abc", "def", "\0" };
Run Code Online (Sandbox Code Playgroud)

虽然,两者都有效.我们只需要对条件进行相应的检查

喜欢

array[ index ] != '\0';
Run Code Online (Sandbox Code Playgroud)

要么

array[ index ] != "\0";
Run Code Online (Sandbox Code Playgroud)

我的问题是哪一个更好?大多数程序员使用哪种?

编辑

大多数答案都说NULL优于'\ 0'和"\ 0".但我一直都这么认为

NULL与'\ 0'相同,它与0x0或0相同

这是错的吗?

Chr*_*utz 28

我会以此结束NULL.为什么?因为你不能做以下任何一种:

array[index] == '\0'
array[index] == "\0"
Run Code Online (Sandbox Code Playgroud)

第一个是比较a char *和a char,这不是你想要的.你必须这样做:

array[index][0] == '\0'
Run Code Online (Sandbox Code Playgroud)

第二个甚至不起作用.你比较a char *和a char *,是的,但这种比较毫无意义.如果两个指针指向同一块内存,它会通过.你不能==用来比较两个字符串,你必须使用这个strcmp()函数,因为C没有内置的支持字符串以外的一些(我的意思是很少)语法细节.以下内容:

array[index] == NULL
Run Code Online (Sandbox Code Playgroud)

工作得很好并传达了你的观点.

  • Nitpick - 第一个比较实际上是OK - `'\ 0'`是一个零的整数值,在这个上下文中被评估为空指针常量.但这不是一个好主意,因为它传达了作者的混淆感.如果你的意思是'NULL`,说'NULL`. (10认同)
  • @caf正是我想写的,+ 1.@Chris,并注意在C中,字符文字实际上具有类型`int`而不是`char`(但这不会改变它作为空指针常量的能力 - `char`也是一个整数类型).修复它,我也会+1你xD (4认同)

Chr*_*oph 7

根据C99规范,

  • NULL 扩展为空指针常量,这不是必需的,但通常是类型 void *
  • '\0'是一个字符常数; 字符常量是类型的int,所以它与plain相当0
  • "\0" 是一个以null结尾的字符串文字,等同于复合文字 (char [2]){ 0, 0 }

NULL,'\0'并且0都是空指针常量,因此它们都将在转换时产生空指针,而"\0"产生非空char *(应该被视为const修改未定义); 因为这个指针对于每个文字的出现可能是不同的,所以它不能用作标记值.

虽然您可以使用值的任何整数常量表达式0作为空指针常量(例如'\0'sizeof foo - sizeof foo + (int)0.0),但您应该使用它NULL来明确您的意图.


Mar*_*wis 6

在这两个中,第一个是类型错误:'\ 0'是一个字符,而不是一个指针.编译器仍然接受它,因为它可以将其转换为指针.

第二个"只能巧合"."\ 0"是两个字符的字符串文字.如果它们出现在源文件中的多个位置,则编译器可以(但不一定)使它们相同.

所以写第一个的正确方法是

char* array[] = { "abc", "def", NULL };
Run Code Online (Sandbox Code Playgroud)

你测试一下array[index]==NULL.测试第二个的正确方法是 array[index][0]=='\0':你也可以在字符串中删除'\ 0'(即拼写为""),因为它已经包含一个空字节.