为什么可以将字符串指针初始化为字符串文字,而不是数组?
字符串可以用字符串文字初始化
char word1[] = "abc";
或作为带有空终止符的字符数组。
char word2[] = {'a', 'b', 'c', ' '};
除了书写外word1[],word1 也可以用指针表示法书写
char *word1 = "abc";
但是,当尝试用指针表示法编写 word2 时
char *word2 = {'a', 'b', 'c', ' '};
它向我展示了一堆警告,例如
警告:标量初始值设定项中的元素过多 char *word2 = {'a', 'b', 'c', ' '};
当我运行程序时,我得到Segmentation fault (core dumped).
这是为什么?为什么你能写char *word = "abc"但不能char *word = {'a', 'b', 'c', ' '}?
回答
为什么可以将字符串指针初始化为字符串文字,而不是数组?
因为{'a', 'b', 'c', ' '}不是数组;它是要放入正在初始化的事物中的值列表。
该语法{'a', 'b', 'c', ' '}不代表 C 中的数组。人们看到它用于初始化数组,但是,当以这种方式使用时,它只是一个值列表。它也可用于初始化结构,因为它只是列出要放入正在初始化的事物中的值。它本身不是一个数组。
在char *word2 = {'a', 'b', 'c', ' '};,它没有任何意义初始化word2的价值观'a','b','c',和' '。它只是一个指针,应该用一个值初始化。给出一个包含四个值的列表来初始化一件事是没有意义的。
在char *word2 = "abc";,"abc"不是值列表。它是一个字符串文字。字符串字面量定义了一个用字符串字符填充的静态数组。然后字符串文字会自动转换为指向其第一个元素的指针,并且正是这个指针用于初始化word2.
这样char *word2 = "abc";做两两件事:字符串文字定义了一个阵列,并且初始化集word2到指向该阵列的第一个元素。相比之下,在 中char *word2 = {'a', 'b', 'c', ' '};,没有什么可以定义数组;值列表只是一个值列表。
将其与数组初始化进行比较,在 中char word2[] = {'a', 'b', 'c', ' '};,使用值列表初始化数组,这很好。然而,在 中char word1[] = "abc";,发生了一些特殊的事情。C 2018 6.7.9 14 说我们可以用字符串字面量来初始化字符类型的数组,字符串的字符会被用来初始化数组的元素。