如何初始化结构中的元素?我有这个结构:
typedef struct { int mat[x][x]; int res; } graphe;
graphe g;
我期待这个工作:
g.mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}};
但事实并非如此。
答案 0 :(得分:2)
主要问题是数组不可分配,并且当您想要设置g.mat
时,它已经默认初始化。您尝试的是将值分配给现有实例的成员。一个较小的问题是一些缺失的大括号。
您可以使用所需的初始化 g
对象,而不是默认初始化graphe
,然后尝试将值分配给其成员成员的价值观:
graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}};
这也会隐式初始化g.res
到0
,但您也可以将其初始化为特定值:
graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}, 42};
以下是使用designated initializers的示例。这可能比前面的示例更容易阅读,您可以更改字段的顺序:
graphe g = { .mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}}, .res = 42};
答案 1 :(得分:1)
您可以在定义点初始化 g
,如@ juanchopanza的回答所示。
但是,您也可以稍后将新值分配给g
(如果需要),方法是使用类似的语法与复合文字结合使用C语言的特点
g = (graphe) { { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, 42 };
请注意,赋值运算符仅适用于整个struct对象。如果要仅为g.mat
数组分配新值,而不是触及g
的任何其他字段,则赋值运算符不会为此目的而工作,因为C中的数组不可分配。但是,您仍然可以将memcpy
与复合文字结合使用,将新值复制到g.mat
memcpy(g.mat, (int [x][x]) { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, sizeof g.mat);
这实际上是您在问题中尝试做的事情。