C char 数组 v C char* 初始化

标签 c string initialization declaration

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”


  1. 您可以使用 compound literal expression :

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

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

关于C char 数组 v C char* 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906312/

相关文章:

c - 理解递归函数调用

c# - 与列表进行快速字符串比较

c++ - C++中用户定义类型的静态初始化

c - 使用 C 递归删除目录

c - 如何使用 GNU C vector 扩展从 double 组加载/存储到 double 组?

c - 在单独的目录中构建 cscope.out 文件

模板类中的 C++ 静态常量数组初始化

Java ArrayList拆分每个对象

php - 将 TINYINT(1) 转换为字符串

c++ - 在 C++11 中哪些临时对象不能用 `someType()` 初始化?