C中的二维数组字符串

akr*_*ki1 2 c arrays

我在C中创建一个将使用文本菜单的应用程序.所以,我决定创建一个包含所有菜单的全局数组.作为稍后我将提到的问题的解决方法,代码如下所示:

char* main_menu[]=
{"Refresh rate", "Help", "Default config", NULL};
char* other_stuff[]=
{"Stuff", "More", NULL};

char** screens[]={main_menu, other_stuff};
Run Code Online (Sandbox Code Playgroud)

我可以使用这些字符串:screens[0][1]在第0个/第一个菜单中首先表示(或者说第二个,因为我们从零开始计算)选项.

它有效,但它让我觉得非常不优雅,我必须声明那些辅助阵列(main_menuother_stuff).我试图利用数组的嵌套大括号初始化,但总是编译器会抱怨.此外,在你建议将阵列声明为,比如说之前,char* screeens[10][5]应该没有神奇的数字,因为这对我来说同样不优雅.

我试过了:

char** screens[]={
{"Refresh rate", "Help", "Default config", NULL},
{"Stuff", "More", NULL}
};
Run Code Online (Sandbox Code Playgroud)

但是,编译器给了我一个警告(理所当然,因为访问元素会产生乱码):

../main.c:96:1: warning: braces around scalar initializer [enabled by default]
 {"Refresh rate", "Help", "Default config", NULL},
^
../main.c:96:1: warning: (near initialization for ‘screens[0]’) [enabled by default]
../main.c:96:1: warning: initialization from incompatible pointer type [enabled by default]
../main.c:96:1: warning: (near initialization for ‘screens[0]’) [enabled by default]
../main.c:96:1: warning: excess elements in scalar initializer [enabled by default]
Run Code Online (Sandbox Code Playgroud)

等等.

如果我将第一行更改为char* screens[][]={,编译器将根本不编译代码,给出错误:error: array type has incomplete element type.

我正在编写嵌入式环境(avr-gcc 4.8.1),其中内存非常稀缺,所以我不想声明大于必要的数组,从而浪费内存.有什么我可以做的,或者这是否尽可能简单?

Jon*_*ler 6

假设你有C99或更高版本,你可以使用'复合文字'来初始化你的数组:

#include <stddef.h>    // NULL

char **screens2[] =
{
    (char *[]){ "Refresh rate", "Help", "Default config", NULL },
    (char *[]){ "Stuff", "More", NULL },
};
Run Code Online (Sandbox Code Playgroud)

或者,如果你想成为 - const正确(一件好事 - 感谢MM和他的评论):

char const * const * screens3[] =
{
    (char const * const []){ "Refresh rate", "Help", "Default config", NULL },
    (char const * const []){ "Stuff", "More", NULL },
};
Run Code Online (Sandbox Code Playgroud)

编译(清理 - 没有警告或错误):

gcc -std=c11 -O3 -g -Wall -Wextra -Werror -pedantic -c 2das.c
Run Code Online (Sandbox Code Playgroud)

(Mac OS X 10.10.5上的GCC 5.1.0)