C语言一次性初始化二维const字符串数组出现警告,如何解决?
问题解决:一次性初始化二维字符串数组的警告问题
你的一次性初始化写法触发warning: excess elements in scalar initializer警告的核心原因是:char** test[]的每个元素是指针类型(char**),但直接用{"John", ...}这类数组初始化列表时,C语言无法自动将其转换为char**指针——初始化列表仅能用于初始化数组,不能直接给标量(指针属于标量)赋值。
正确的一次性初始化写法
使用C99引入的复合字面量,显式声明内层数组的类型,让编译器将其转换为符合要求的指针:
char** test[] = { (char*[]){"John", "Adrian", "Mary", NULL}, (char*[]){"Paris", "London", "Amsterdam", "Madrid", NULL}, NULL };
更规范的写法(推荐)
字符串字面量本质是不可修改的,直接用char*指向存在潜在未定义行为,建议添加const修饰让类型更严谨:
const char* const test[] = { (const char*[]){"John", "Adrian", "Mary", NULL}, (const char*[]){"Paris", "London", "Amsterdam", "Madrid", NULL}, NULL };
分步写法无问题的原因
分步定义时,names是char*[]类型的数组,在表达式中数组名会自动隐式转换为指向首元素的指针(即char**类型),因此可以直接作为test的元素初始化值。而一次性写法没有中间数组变量,必须通过复合字面量显式创建匿名数组,才能完成类型转换。
内容的提问来源于stack exchange,提问作者yo3hcv
相关产品推荐
相关产品推荐

