为什么可以将字符串指针初始化为字符串文字,而不是数组?

字符串可以用字符串文字初始化

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 说我们可以用字符串字面量来初始化字符类型的数组,字符串的字符会被用来初始化数组的元素。


以上是为什么可以将字符串指针初始化为字符串文字,而不是数组?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>