的char *的数组应该在 '\\ 0' 或“\\ 0”结束?(Array of c

2019-07-19 19:06发布

比方说,我们有字符数组的指针

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

这是错的吗?

Answer 1:

我会结束它NULL 。 为什么? 因为你不能做任何的这些:

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

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

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

第二个甚至不工作。 你是一个比较char *一个char * ,是的,但这种比较是没有意义的。 它传递如果这两个指针指向同一块内存。 不能使用==比较两个字符串,你必须使用strcmp()函数,因为C没有内置的几个外串支持(我的意思是少数)语法细微。 鉴于以下几点:

array[index] == NULL

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



Answer 2:

按照C99规范,

  • NULL扩展到一个空指针常数,这是不必需的,但通常是类型的void *
  • '\0'是字符串常量; 字符常量是类型int ,所以它的equivalen平淡0
  • "\0"是一个空终止字符串文字和相当于化合物文字(char [2]){ 0, 0 }

NULL'\0'0都是空指针常量,所以他们会在转换所有产量空指针,而"\0"产生一个非空char * (其应被视为const作为修改是未定义的); 因为这指针可以是用于文字的每次出现时不同,它不能被用来作为标记值。

虽然你可以使用任何有价值的整型常量表达式0作为空指针常数(如'\0'sizeof foo - sizeof foo + (int)0.0 ),你应该使用NULL ,让您的意图明显。



Answer 3:

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

第二个“作品”只是巧合。 “\ 0”是文字的两个字符的字符串。 如果这些发生在源文件中的多个地方,编译器可能,但不一定使他们一致。

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

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

和您测试array[index]==NULL 。 以测试第二个正确的方法是array[index][0]=='\0' ; 你也可以在字符串中删除“\ 0”(即拼写为"" ),因为这将已经包括一个空字节。



Answer 4:

当然,从技术上'\0'是一个字符,而"\0"是一个字符串,所以如果你正在检查空终止字符前者是正确的。 然而,正如克里斯·卢茨在他的回答指出 ,你的比较不会在它目前的形式工作。



Answer 5:

字符数组以空字符的结束只是一个约定,是专门为C.字符串你正在处理完全不同的东西 - 字符数组的指针 - 因此它确实没有关系公约对C字符串。 当然,你可以选择一个空指针终止它; 也许可能是您的指针数组约定。 还有其他的方法来做到这一点。 你不能要求人们如何“应该”的工作,因为你承担一些惯例是不存在。



Answer 6:

空终止是在历史书最好留下了不好的设计模式。 有仍有大量的落后C字符串的惯性,所以无法避免存在。 但是,没有任何理由在OP的用法示例。

不使用任何终止子,和使用sizeof(数组)/的sizeof(数组[0]),以获得元素的数量。



文章来源: Array of char* should end at '\\0' or “\\0”?
标签: c pointers null