可以声明吗
char str[]="abcdef";
和
char *str="abcdef";
用于解释 C 中的 char 数组和字符串字面量?char数组和字符串文字之间有什么关系?除了存储字符串文字之外,char 数组的实际用途是什么?
可以声明吗
char str[]="abcdef";
和
char *str="abcdef";
用于解释 C 中的 char 数组和字符串字面量?char数组和字符串文字之间有什么关系?除了存储字符串文字之外,char 数组的实际用途是什么?
char
字符串文字是不可修改的数组。
C99 6.4.5 p2:
字符串文字是用双引号括起来的零个或多个多字节字符序列,如“xyz”。
然后,在 C99 6.4.5 p5 中:
在翻译阶段 7 中,将一个字节或值为零的代码附加到由一个或多个字符串文字产生的每个多字节字符序列。然后使用多字节字符序列来初始化一个静态存储持续时间和长度刚好足以包含该序列的数组。对于字符串文字,数组元素具有 type
char
,并使用多字节字符序列的各个字节进行初始化;...
我的 C11 草案有类似的措辞。我相信它的措辞是“具有类型char
”,正是为了允许将字符串文字分配给char *
. 但是,该标准确实在 C99 6.4.5 p6 中继续说:
如果程序尝试修改这样的数组,则行为未定义。
如此可分配,但不可修改。
字符串文字可用作 . 数组的初始值设定项char
。从 C99 6.7.8 p14 开始:
字符类型的数组可以由字符串字面量初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。
你的第二个任务是错误的。它应该是一个const char *
字符串文字,当分配给一个指针时,它们是常量,但是当它们初始化一个数组时它们变得可修改。例如,您不能在调用中使用第二个版本strtok()
(谷歌其手册页以查看原因!)