在C语言中能否无需变量名声明不同长度数组的数组?
无需单独命名子数组实现多级字符串指针数组的方法
你想要直接创建一个指向多个以NULL结尾的字符串数组的指针数组,不用给每个子数组单独命名,直觉方向是对的,但原写法存在类型不匹配的问题,下面是可行的实现方式:
正确写法(C99及以上支持)
使用复合字面量,通过(char*[]){ ... }的形式创建匿名字符串数组,它会被隐式转换为char**类型,刚好匹配外层数组的元素类型:
static char **my_array[] = { (char*[]) { "one", "two", NULL }, (char*[]) { "another", NULL }, (char*[]) { "more", "items", "here", NULL }, NULL };
为什么这个写法可行?
复合字面量(char*[]) { ... }会生成一个匿名的静态数组对象(因为外层用static修饰,这个匿名数组的生命周期和静态变量一致),数组名可以隐式转换为指向其首元素的指针,也就是char**类型,完美适配外层数组的元素类型。
验证代码
可以用下面的代码测试数组是否能正常遍历:
#include <stdio.h> static char **my_array[] = { (char*[]) { "one", "two", NULL }, (char*[]) { "another", NULL }, (char*[]) { "more", "items", "here", NULL }, NULL }; int main() { // 遍历外层指针数组 for (char ***current_list = my_array; *current_list != NULL; current_list++) { // 遍历每个子字符串数组 for (char **current_str = *current_list; *current_str != NULL; current_str++) { printf("%s ", *current_str); } printf("\n"); } return 0; }
运行后会输出:
one two another more items here
为什么你的原写法不行?
你原来的写法里,内层的{ "one", "two", NULL }被编译器当作是给单个char**变量初始化的列表,但char**是一个指针,只能接收一个地址值,不能直接用多个字符串常量初始化,类型不匹配,所以编译会报错。
内容的提问来源于stack exchange,提问作者Lee Essen
相关产品推荐
相关产品推荐

