我尝试按照以下link启动我的数据:
struct dmparam {
char *p;
char *v;
};
struct dmobj {
int a;
int b;
const struct dmparam * const *dmparam;
};
const struct dmobj dmobj[] = {
{1, 11, NULL},
{2, 22,
(struct dmparam * const []) {//params
{"p1", "v1"},
{"p2", "v2"},
}//params
},
{3, 33, NULL},
};
但是我在编辑中收到了警告
test.c:35:3: warning: braces around scalar initializer [enabled by default]
{"p1", "v1"},
^
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:35:3: warning: initialization from incompatible pointer type [enabled by default]
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:35:3: warning: excess elements in scalar initializer [enabled by default]
test.c:35:3: warning: (near initialization for ‘(anonymous)[0]’) [enabled by default]
test.c:36:3: warning: braces around scalar initializer [enabled by default]
{"p2", "v2"},
^
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:36:3: warning: initialization from incompatible pointer type [enabled by default]
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:36:3: warning: excess elements in scalar initializer [enabled by default]
test.c:36:3: warning: (near initialization for ‘(anonymous)[1]’) [enabled by default]
test.c:38:2: warning: initialization from incompatible pointer type [enabled by default]
},
^
test.c:38:2: warning: (near initialization for ‘dmobj[1].dmparam’) [enabled by default]
我缺少什么?
答案 0 :(得分:1)
您只缺少两个指数级别。 dmobj::dmparam
是(暂时忘记const struct dmparam **
,它指向指向(const)dmparam
的(const)指针。
编译器尝试使用dmparam
数组直接初始化,而不是使用指向指针的指针进行初始化。 Clang警告是显式的:不兼容的指针类型使用类型为'char [3]'的表达式初始化'struct dmparam * const'。编译器不够聪明,无法猜出你想要的东西......
你必须在这里明确:
const struct dmparam params [] = {
{"p1", "v1"},
{"p2", "v2"},
};
const struct dmparam * const p = params;
const struct dmobj dmobj[] = {
{1, 11, NULL},
{2, 22, &p },
{3, 33, NULL},
};
此处params
是const dmparam
的数组,p
是指向params
(另一个变量)的const指针,并且您输入p
的地址在dmobj[1]
。