我正在try 确定是否可以执行以下操作,但不必声明各个变量……

static char *set_list1[] = { "set", "one", NULL };
static char *set_list2[] = { "set", "one", "negative", NULL };
static char *set_list3[] = { "set", NULL };
static char *set_list4[] = { "set", "one", "new", "item", "here", NULL };
static char **set_list[] = { set_list1, set_list2, set_list3, set_list4, NULL };

基本上,我需要一个指针数组,然后每个指针指向一个可变长度的字符串数组(恰好以空指针结束.

显然,我可以像上面那样声明它,但有没有一种方法可以做到这一点,而不必声明每个名称呢?

直觉上,这感觉应该行得通,但没有...

static char **my_array[] = {
    { "one", "two", NULL },
    { "another", NULL },
    { "more", "items", "here", NULL },
    NULL
};

感谢任何帮助

推荐答案

例如,在C23中,您可以使用复合文字,如

static char **my_array[] = {
    ( static char * [] ){ "one", "two", NULL },
    ( static char * [] ){ "another", NULL },
    ( static char * [] ){ "more", "items", "here", NULL },
    NULL
};

或相同的声明,但没有存储类说明符static

static char **my_array[] = {
    ( char * [] ){ "one", "two", NULL },
    ( char * [] ){ "another", NULL },
    ( char * [] ){ "more", "items", "here", NULL },
    NULL
};

C++相关问答推荐

初始化char数组-用于初始化数组的字符串是否除了存储数组的位置之外单独存储在内存中

为什么这个select()会阻止?

ISO_C_BINDING,从Fortran调用C

ATmega328P USART发送字符重复打印

在函数中使用复合文字来初始化C语言中的变量

GCC引发不明确的诊断消息

在基本OpenGL纹理四边形中的一个三角形中进行渲染

无法在OpenGL上绘制三角形

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

Caesar密码调试:输出文本末尾的问号和随机字符

通过k&;r语法的c声明无效

生成一个半RNG,结果用C表示(无随机/随机)

如何使用calloc和snprintf

浮动目标文件,数据段

为什么这个代码的最后一次迭代不能正常工作?

如何使crc32的结果与cksum匹配?

在链表中插入一个值

C 中类型说明符的顺序重要吗?

如何确定 C 程序中的可用堆内存

我如何(合规地)从 tmpfile() 读取?