2012-03-12 52 views
4

我有以下结构:如何初始化结构数组成员用C

typedef struct { 
    int someArray[3][2]; 
    int someVar; 
} myStruct; 

如果我创建这个结构在我的主数组(像下面),我将如何初始化呢?

int main() { 
    myStruct foo[5]; 
} 

我想初始化结构体的方式在上述阵列类似于initilazing正常阵列(见下面):

int main() { 
    int someArray[5] = {1,4,0,8,2}; 
} 
+0

只是因为一些事情可以做,并不一定意味着你应该做他们。考虑一下从未看过你的代码的人会如何看待这样的初始化。 – 2012-03-12 14:47:57

+2

@HunterMcMillen - 在许多情况下,这是比别人更好的选择。 – MByD 2012-03-12 14:57:21

+0

@BinyaminSharet我只是相信在维护方面,初始化每一部分清楚地评论每一步会更加清楚。你可以举一个例子,这是首选吗?没有人想到我。 – 2012-03-12 15:03:56

回答

24

从外面工作的你知道你有5件事情的数组初始化:

mystruct foo[5] = { 
        X, 
        X, 
        X, 
        X, 
        X 
        }; 

其中X是一台为mystruct类型的初始化。所以现在我们需要弄清楚每个X的样子。的mystruct每个实例有两个元素,somearraysomevar,所以你知道你的X初始化会像

X = { Y, Z } 

代回原来的声明中被结构化的,我们现在得到

mystruct foo[5] = { 
        { Y, Z }, 
        { Y, Z }, 
        { Y, Z }, 
        { Y, Z }, 
        { Y, Z } 
        }; 

现在,我们需要弄清楚每个Y的样子。 Y对应于int的3x2阵列的初始化器。再次,我们可以在从外部的工作,你有一个3元素数组的初始化:

Y = { A, A, A } 

,其中每个阵列元素是int一个2元素的数组:

A = { I, I } 

Subsituting回为Y,我们得到

Y = { { I, I }, { I, I }, { I, I } } 

代,早成X,我们得到

X = { { { I, I }, { I, I }, { I, I } }, Z } 

现在让我们

mystruct foo[5] = { 
        { { { I, I }, { I, I }, { I, I } }, Z }, 
        { { { I, I }, { I, I }, { I, I } }, Z }, 
        { { { I, I }, { I, I }, { I, I } }, Z }, 
        { { { I, I }, { I, I }, { I, I } }, Z }, 
        { { { I, I }, { I, I }, { I, I } }, Z } 
        }; 

由于Z是一台为一个整数,我们并不需要打破它的任何进一步。只是实际的整数值取代I S和Z秒,你就大功告成了:

mystruct foo[5] = { 
        {{{101, 102}, {201, 202}, {301, 302}}, 41}, 
        {{{111, 112}, {211, 212}, {311, 312}}, 42}, 
        {{{121, 122}, {221, 222}, {321, 322}}, 43}, 
        {{{131, 132}, {231, 232}, {331, 332}}, 44}, 
        {{{141, 142}, {241, 242}, {341, 342}}, 45} 
        }; 
+1

+1:很好的呈现。 – 2012-03-12 18:14:46

0

喜欢的是:

int main() { 
         // someArr initialization | someVar initialization 
    mystruct foo[5] = { { { {1, 2}, {1,2}, {1, 2} }, 1      }, // foo[0] initialization 
         //... 
         }; 
} 
3

裹初始化对于一组花括号中的每个结构元素:

myStruct foo[5] = 
{ 
    { { { 11, 12 }, { 13, 14 }, { 55, 56 }, }, 70 }, 
    { { { 21, 22 }, { 23, 24 }, { 45, 66 }, }, 71 }, 
    { { { 31, 32 }, { 33, 34 }, { 35, 76 }, }, 72 }, 
    { { { 41, 42 }, { 43, 44 }, { 25, 86 }, }, 73 }, 
    { { { 51, 52 }, { 53, 54 }, { 15, 96 }, }, 74 }, 
}; 
+1

我想你可能错过了第二行的'{'。这与你的回答是一样的 – 2012-03-12 15:11:43

+0

@BinyaminSharet:GCC对代码感到满意。在每条数据线上都有一组平衡的开放和关闭的大括号,在数据行前后的行的起始处使用周围的“{”和“};”。 – 2012-03-12 15:17:31

+0

的确,我错过了第一个'{'抱歉。 – MByD 2012-03-12 15:17:40