我有以下代码,无法正常工作。它可以编译,但是在执行时会引发很多警告和段错误:
#include <stdio.h>
enum output {
A,
B,
C,
D,
};
struct translation {
char *from;
enum output to;
};
struct dictionary {
struct translation *foo;
struct translation *bar;
};
enum language {
ONE,
ANOTHER,
};
struct dictionary languages[] = {
[ONE] = {
.foo = {
{"LF", A},
{"LLF", C},
{"RRF", D},
},
.bar = {
{"L", B},
},
},
[ANOTHER] = {
.foo = {
{"FF", B},
{"RRF", D},
},
.bar = {
{"LF", B},
{"R", C},
{"RR", D},
},
},
};
int main(void)
{
printf("%s\n", languages[ONE].foo[0].from);
return 0;
}
我可能正在初始化languages
错误的方式。
languages
一个可以通过language
以下方式访问不同字典的数组:languages[ONE]
languages[ONE].foo
那有可能吗?我究竟做错了什么?
当编译时,gcc
我得到以下(裁剪)输出:
asdf.c:27:17: warning: braces around scalar initializer
.foo = {
^
asdf.c:27:17: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:25: warning: braces around scalar initializer
{"LF", A},
^
asdf.c:28:25: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:26: warning: initialization of ‘struct translation *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
[...]
对于代码的多个部分重复相同的警告/注释。
您可以执行以下两项操作:
struct translation *foo;
和分配内存struct translation *bar;
(您也可以malloc
用来动态分配内存)。例如:结构字典 { 结构翻译foo [10]; struct translation bar [10]; };
struct字典语言[] = { [ONE] = { .foo =(结构翻译[]){ {“ LF”,A}, {“ LLF”,C}, {“ RRF”,D}, } ,.bar =(结构翻译[]){ {“ L”,B}, }, }, [ANOTHER] = { .foo =(结构翻译[]){ {“ FF”,B}, {“ RRF”,D} , } ,.bar =(结构翻译[]){ {“ LF”,B}, {“ R”,C}, {“ RR”,D}, }, }, };
注意
正如提到@MM,加入预选赛const
之前struct dictionary
是一个好主意,如果它的值不会在运行时改变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句