2016-01-21 89 views
3
#include <stdio.h> 

int main() 
{ 
    typedef struct s 
    { 
     int a; 
     int b[5]; 
     char c[2]; 
    }st; 

    st vs[1]; 

    vs[0] = {1,{1,2,3,4,5},{'c','d'}}; 

    printf("%d:a\n",vs[1].a); 
    printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]); 
    printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]); 

    return 0; 
} 

爲什麼這樣不起作用?初始化陣列元素的結構陣列

gcc -o main *.c 

我得到這個錯誤

main.c: In function 'main': main.c:15:12: error: expected expression before '{' token vs[0] ={1,{1,2,3,4,5},{'c','d'}};

但是,如果我有這樣的:

#include <stdio.h> 

int main() 
{ 
    typedef struct s 
    { 
     int a; 
     int b[5]; 
     char c[2]; 
    }st; 

    st vs[] = { 
       {1,{1,2,3,4,5},{'c','d'}} 
       }; 

    printf("%d:a\n",vs[0].a); 
    printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]); 
    printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]); 

    return 0; 
} 

它的工作原理。這是什麼邏輯。

如何使用st和[1]方法使其工作?

回答

3

初始化是在聲明變量和它作爲聲明的一部分提供的初始值。例如,這是合法的:

st vs[1] = { {1,{1,2,3,4,5},{'c','d'}} }; 

您的代碼實際上是試圖分配。賦值是當一個現有變量賦值給它的時候。你的代碼不起作用的原因是{1,{1,2,3,4,5},{'c','d'}}不是一個值。

在聲明(而不是聲明)中,每個表達式必須由編譯器根據其自身的優點可讀,並且一個更復雜的語句由運算符加入的各種表達式組成。所以編譯器不知道該怎麼處理{1,{1,2,3,4,5},{'c','d'}} - 在這個階段它不知道這應該是st

由於C99有一個新的語言結構可以用在這裏,所謂複合文字

vs[0] = (const st){1,{1,2,3,4,5},{'c','d'}}; 

請注意,這不是一個轉換運算應用到某種支撐的表達;它是一個單一的句法結構(Typename){ initializers }

我使用的const是一個微型優化,它可以幫助編譯器將文字存儲在可執行文件的只讀塊中並允許不斷摺疊。

8

當你聲明一個變量時,你只能做加強初始化。所以,

st vs[] = { 
      {1,{1,2,3,4,5},{'c','d'}} 
      }; 

是允許的。但是

vs[0] = {1,{1,2,3,4,5},{'c','d'}}; 

不是。因爲這不是初始化,而是分配。

然而,可以使用C99的化合物文字,請參閱C11, 6.5.2.5

vs[0] = (struct s){1,{1,2,3,4,5},{'c','d'}};