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

时间:2009-09-27 10:03:00

标签: c pointers null

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

char* array[] = { "abc", "def" };

现在应该放什么?

char* array[] = { "abc", "def", '\0' };

char* array[] = { "abc", "def", "\0" };

虽然,两者都有效。我们只需要将条件相应地检查结束

array[ index ] != '\0';

array[ index ] != "\0";

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

修改

大多数答案都说NULL优于'\ 0'和“\ 0”。 但我一直以为

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

相同

是不是错了?

6 个答案:

答案 0 :(得分:27)

我会以NULL结束。为什么?因为你不能做到以下任何一个:

array[index] == '\0'
array[index] == "\0"

第一个是将char *char进行比较,你想要的是什么。你必须这样做:

array[index][0] == '\0'

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

array[index] == NULL

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

答案 1 :(得分:7)

根据C99规范,

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

NULL'\0'0都是空指针常量,因此它们都会在转换时产生空指针,而"\0"会产生非空char * 1}}(由于修改未定义,因此应视为const);因为对于文字的每次出现,这个指针可能不同,所以它不能用作哨兵值。

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

答案 2 :(得分:6)

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

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

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

char* array[] = { "abc", "def", NULL };

并测试array[index]==NULL。测试第二个的正确方法是 array[index][0]=='\0';您也可以删除字符串中的'\ 0'(即将其拼写为""),因为它已经包含空字节。

答案 3 :(得分:1)

嗯,技术上'\0'是一个字符,而"\0"是一个字符串,所以如果你正在检查空终止字符,那么前者是正确的。但是,作为Chris Lutz points out in his answer,您的比较将无法以其当前形式发挥作用。

答案 4 :(得分:0)

使用空字符的字符数组的终止只是一个专门针对C中的字符串的约定。您正在处理完全不同的东西 - 一个字符指针数组 - 所以它实际上与C字符串的约定。当然,你可以选择用空指针终止它;这可能是你指针数组的惯例。还有其他方法可以做到这一点。你不能问人们它应该如何工作,因为你假设某些惯例不存在。

答案 5 :(得分:0)

空终止是历史书中最好留下的糟糕设计模式。 c弦背后仍有很多惯性,因此无法避免。但是没有理由在OP的例子中使用它。

不要使用任何终结符,并使用sizeof(array)/ sizeof(array [0])来获取元素的数量。