2014-04-10 122 views
0

初始化以下2級嵌套數組的正確語法是什麼?如何初始化嵌套數組

z3 srC# cat tc.c 
#include <stdio.h> 

typedef struct level1_t { 
     char       var[15]; 
     int       value; 
} level1_t; 

typedef struct level2_t { 
    level1_t  data[3]; 
} level2_t; 

level2_t level2[1] = { 
       [0]={ 
         [0]={"one",1}, 
         [1]={"two",2}, 
         [2]={"three",3} 
       } 
}; 

int main() { 

     printf("%s\n",level2[0].data[1].var); 
} 
z3 srC# gcc -ggdb -o tc tc.c 
tc.c:14:4: error: array index in non-array initializer 
tc.c:14:4: error: (near initialization for 'level2[0]') 
tc.c:15:4: error: array index in non-array initializer 
tc.c:15:4: error: (near initialization for 'level2[0]') 
tc.c:15:4: error: extra brace group at end of initializer 
tc.c:15:4: error: (near initialization for 'level2[0]') 
tc.c:15:4: warning: excess elements in struct initializer 
tc.c:15:4: warning: (near initialization for 'level2[0]') 
tc.c:16:4: error: array index in non-array initializer 
tc.c:16:4: error: (near initialization for 'level2[0]') 
tc.c:16:4: error: extra brace group at end of initializer 
tc.c:16:4: error: (near initialization for 'level2[0]') 
tc.c:16:4: warning: excess elements in struct initializer 
tc.c:16:4: warning: (near initialization for 'level2[0]') 
z3 srC# 
+0

正如一個警告,這句法只能用C ISO C99(不是C++)。 –

回答

4

變化

level2_t level2[1] = { 
       [0]={ 
         [0]={"one",1}, 
         [1]={"two",2}, 
         [2]={"three",3} 
       } 
}; 

level2_t level2[1] = { 
       [0].data = { 
         [0]={"one",1}, 
         [1]={"two",2}, 
         [2]={"three",3} 
       } 
}; 

現在你要初始化結構數組,而你需要初始化data領域。

正如你在評論中問道,這裏是如何做同樣的事情沒有索引:

level2_t level2[] = { 
    { 
     .data = { 
      {"one", 1}, 
      {"two", 2}, 
      {"three", 3} 
     } 
    } 
}; 
+0

有沒有機會知道沒有方括號[0],[1],[2]的語法是什麼? – Nulik

+0

剛更新了我的帖子。 – pNre

+0

非常感謝!優秀的答案,+1 – Nulik

0
level2_t level2 = 
{ 
    {"one, 1}, 
    {"two, 2}, 
    {"three", 3} 
}; 
+0

這是初始化整個數據結構的更好方式,因爲它更便於攜帶。 –

+0

是的,但它沒有詳細說明嵌套,也沒有指定數組的固定大小,如果我犯了一個語法錯誤並且初始化比我應該更大的結構呢? – Nulik