gcc
6.3 版接受以下为有效的 c
代码:
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”
。
您可以使用 compound literal expression :
char *green = (char[]){ 'a', 'b', 'c' };
它告诉编译器创建一个未命名的对象(其生命周期取决于声明的范围),它是字符数组类型并用这三个字符初始化。然后为该指针分配该对象的地址。
关于C char 数组 v C char* 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906312/