【发布时间】:2021-12-11 08:19:25
【问题描述】:
我在结构中有一个二维字符串数组,我希望能够在编译时使用复合文字初始化它,而不是使用 malloc() 动态初始化它。
这个字符串数组的含义是它是一个项目数组,每个项目有三个字符串(一个是项目的名称,另一个是描述,另一个是 URL)。
是的,我知道我可以使用三个数组,但我更愿意将它打包成一个二维数组。
我试图这样写(注意我只是初始化项目的名称,而不是描述或 URL……这是故意的,因为我假设指向描述和 URL 的指针将根据指定的初始化器行为自动初始化为NULL——当你不初始化一个字段时,它变成零)
我的尝试:
enum labelkind {
L_NAME,
L_DESCRIPTION,
L_URL,
L_NUMKINDS};
struct labeltype{
int someval;
size_t nlabels;
char **labels[L_NUMKINDS];
};
static struct labeltype mylabel = {
.someval=10,
.nlabels=3,
.labels=(char *[][L_NUMKINDS]){
[0][L_NAME]="First name",
[1][L_NAME]="Second name",
[2][L_NAME]="Third name"
}
};
用 clang 编译它,我收到以下警告:
main.c:266:10: warning: incompatible pointer types initializing 'char **' with an expression of type 'char *[3][3]'
[-Wincompatible-pointer-types]
.labels=(char *[][L_NUMKINDS]){
^~~~~~~~~~~~~~~~~~~~~~~
main.c:266:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
.labels=(char *[][L_NUMKINDS]){
^~~~~~~~~~~~~~~~~~~~~~~
{
所以,根据这些警告,我想我做错了什么。
这样做的正确语法是什么?
【问题讨论】:
标签: arrays c c99 compound-literals