在结构C中初始化变量矩阵

时间:2014-10-09 22:17:23

标签: c

如何初始化结构中的元素?我有这个结构:

typedef struct { int mat[x][x]; int res; } graphe;
graphe g;

我期待这个工作:

g.mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}};

但事实并非如此。

2 个答案:

答案 0 :(得分:2)

主要问题是数组不可分配,并且当您想要设置g.mat时,它已经默认初始化。您尝试的是值分配给现有实例的成员。一个较小的问题是一些缺失的大括号。

您可以使用所需的初始化 g对象,而不是默认初始化graphe,然后尝试值分配给其成员成员的价值观:

graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}};

这也会隐式初始化g.res0,但您也可以将其初始化为特定值:

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);

这实际上是您在问题中尝试做的事情。