2012-03-23 127 views
0

我在初始化結構數組中的結構數組時遇到了一個問題。例如,如果我有如下代碼:初始化結構數組中的結構數組

#include <stdio.h> 

int main() { 

typedef struct { 
    int a; 
    int b; 
    int c; 
} FIRST_T; 

typedef struct { 
    int x; 
    int y; 
    int z; 
    FIRST_T *p; 
} SECOND_T; 

FIRST_T p1[]={{1,2,3},{3,4,5},{6,7,8}}; 
FIRST_T p2[]={{4,5,6},{7,8,9}}; 

SECOND_T my_second[]= 
{ 
{1,2,3,p1}, 
{4,5,6,p2} 
}; 

} 

如果我要初始化我在第二陣列intialization部分本身第一陣列,那麼我將如何寫我SECOND_T的類型定義? like

SECOND_T my_second[]= 
{ 
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}}, 
{4,5,6,{{1,1,1},{2,2,2}}} 
}; 

那麼應該怎麼做我的SECOND_T?

我相信,我不能把它定義爲:

typedef struct { 
    int x; 
    int y; 
    int z; 
    FIRST_T p[]; //(I know its a blunder) 
} SECOND_T; 

請幫助。

+0

我沒有得到你的問題,也許如果你說你想要在另一個結構數組裏面初始化一個數組是不可能的。 數組包含一個通過我們可以訪問元素的地址,並且您正在初始化另一個數組中的 ,因此第一個數組元素將如何通過第二個元素訪問。 – 2013-06-14 13:01:41

回答

1

不能定義在C無限陣列的類型,你必須指定尺寸。所以,你要麼做:

typedef strut { 
    int x; 
    int y; 
    int z; 
    FIRST_T f[SOME_VALUE]; 
} SECOND_T; 

然後初始化成員總是SOME_VALUE計數,或做你的方式。

+0

完美謝謝..我完全錯過了這個.. – user1225606 2012-03-23 06:44:23

+0

我會感謝downvoter解釋什麼是錯的。 – littleadv 2012-03-23 08:56:41

+0

我不是downvoter,但它是完全合法的(自C99以來)有靈活的陣列成員,所以你的評論是錯誤的 – hroptatyr 2012-03-23 11:43:03

1

我不認爲你可以這樣做,即在初始化SECOND_T時初始化FIRST_T,而不是第一種方式。想一想,編譯器怎麼能告訴SECOND_T有多少FIRST_T?這裏的問題是,您可以不能靜態定義一個靈活大小的結構數組

0

你不能做這樣的:

SECOND_T my_second[]= 
{ 
{1,2,3,{{1,2,3},{4,5,6},{7,8,9}}}, 
{4,5,6,{{1,1,1},{2,2,2}}} 
}; 

typedef struct { 
int x; 
int y; 
int z; 
FIRST_T p[]; //(I know its a blunder) 

} SECOND_T;

becase的編譯器不知道如何malloc的內存爲這個結構。如果你一定要做到這樣,你應該定義

typedef struct { int x,y,z; FIRST_T p[CONST_VALUE];}SECOND_T; 

,但我建議你使用你寫的第一個樣式。

0

我不知道我是否完全捕獲你的問題。如果要避免要申報輔助變量在結構,你可以使用一個複合文字如下指針:

SECOND_T my_second[] = { 
    {1,2,3, &(FIRST_T){{1,2,3},{3,4,5},{6,7,8}}}, 
    {4,5,6, &(FIRST_T){{4,5,6},{7,8,9}}} 
}; 

你必須是符合以C99爲一個編譯器。