以下版本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
,就会被编译器捕获。
以下会产生错误
char *green = { 'a', 'b', 'c' };
因为green
您相信的初始值设定项不是字符数组。它没有类型,只是一个用大括号括起来的初始化程序列表。它在先前的示例(即white
)中初始化的事物决定了其解释方式。可以使用相同的Initialzier初始化任何能够容纳3个字符的聚合。
但是它green
是一个指针,而不是一个集合,因此您不能使用括号括起来的初始化器列表作为其初始值。1个
现在,以下两个工作但语义有很大不同:
char blue[] = "abc";
char *red = "abc";
blue
是一个数组。它将保留与文字相同的内容"abc"
。red
是一个指针点的文字"abc"
。
您可以使用复合文字表达式:
char *green = (char[]){ 'a', 'b', 'c' };
它告诉编译器创建一个未命名的对象(其寿命取决于声明的范围),该对象具有字符数组类型,并使用这三个字符进行了初始化。然后为指针分配该对象的地址。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句