C char数组v C char *初始化

斯文·威廉姆森(Sven Williamson)

以下版本6.3被有效c代码接受gcc

char white[] = { 'a', 'b', 'c' };
char blue[]  = "abc";
char *red    = "abc";

但是以下失败:

 char *green = { 'a', 'b', 'c' };   // gcc error

我敢肯定有这种情况是完全理性的,但是我想知道是什么。这个问题是由以下情况引起的:必须初始化一个字节数组(unsigned char而不是char),这很容易写出诸如{ '\x43', '\xde', '\xa0' }而不是的内容"\x43\xde\xa0",而一旦您忘记编写my_array[]而不是*my_array,就会被编译器捕获。

讲故事的人-Unslander Monica

以下会产生错误

char *green = { 'a', 'b', 'c' };

因为green您相信的初始值设定项不是字符数组。它没有类型,只是一个用大括号括起来的初始化程序列表。它在先前的示例(即white)中初始化的事物决定了其解释方式。可以使用相同的Initialzier初始化任何能够容纳3个字符的聚合。

但是它green是一个指针,而不是一个集合,因此您不能使用括号括起来的初始化器列表作为其初始值。1个

现在,以下两个工作但语义有很大不同:

char blue[]  = "abc";
char *red    = "abc";

blue是一个数组。它将保留与文字相同的内容"abc"red是一个指针的文字"abc"


  1. 您可以使用复合文字表达式

    char *green = (char[]){ 'a', 'b', 'c' };
    

    它告诉编译器创建一个未命名的对象(其寿命取决于声明的范围),该对象具有字符数组类型,并使用这三个字符进行了初始化。然后为指针分配该对象的地址。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章