2016-01-21 97 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'}};