我需要一些常量字符串数组的数组。这在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
先谢谢你!
2条答案
按热度按时间bxpogfeg1#
您可以使用C99中的数组类型compound literal。
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** []
的“类似二维数组”的语法,那么每个初始化器必须是char*
的数组。一个解决方案是使用复合常量,如答案中的@tstanisl所示。或者坚持你最初的解决方案,它没有任何问题。