c声明初始化、常量、数组或字符串数组

jc3wubiy  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(130)

我需要一些常量字符串数组的数组。这在C中编译得很好

char* names[] = {"John", "Adrian", "Mary", NULL};
char* towns[] = {"Paris", "London", "Amsterdam", "Madrid", NULL};
char** test[] = {names, towns, NULL};

有没有更短的方法把它们都做在一起,像这样?

char** test[] = {{"John", "Adrian", "Mary", NULL}, {"Paris", "London", "Amsterdam", "Madrid", NULL}, NULL};

给出了

warning: excess elements in scalar initializer

先谢谢你!

bxpogfeg

bxpogfeg1#

您可以使用C99中的数组类型compound literal

char** test[] = {(char*[]){"John", "Adrian", "Mary", NULL},
                 (char*[]){"Paris", "London", "Amsterdam", "Madrid", NULL},
                 NULL};
thtygnil

thtygnil2#

解释编译器的隐含消息:
警告:标量初始值设定项周围的大括号
错误:从不兼容的指针类型"char “初始化”char*"
错误:标量初始值设定项中的元素过多
“标量”是C语言中对一个单一项目变量的标准描述,可以是一个普通变量或者一个指针。与“聚合”相反,“聚合”是一个数组或者结构。
char** test[]要求初始值设定项列表由char* []数组或char**项组成。(char* []数组在大多数表达式中使用时将衰减为char**。)但您提供的初始值设定项的类型为char [],衰减为char*
编译器认为{"John", "Adrian", "Mary", NULL}是数组中第一个char**的初始化器,它认为这是一个用大括号括起来的单个项,或者,"John"是一个单独的项,而其余项太多,无法初始化单个char**。因此,出现消息“当您只打算初始化一个char**时,为什么要使用大括号?”和“你为什么要给予多个初始化器”。
然后将char*"John"赋值给char**是无效的C,因此编译器也会给出关于不兼容指针类型的警告。
一种可能的修复方法是丢弃指针到指针,只做一个普通的“mangled”1D数组:

char* test[] = {"John", "Adrian", "Mary", NULL, "Paris", "London", "Amsterdam", "Madrid", NULL, NULL};

如果你想保持char** []的“类似二维数组”的语法,那么每个初始化器必须是char*的数组。一个解决方案是使用复合常量,如答案中的@tstanisl所示。或者坚持你最初的解决方案,它没有任何问题。

相关问题