在C中初始化结构数组

时间:2014-11-01 01:14:02

标签: c arrays struct

我正在做一个简单的学生数据库程序练习,而且我不确定如何初始化一组结构。我尝试使用编译时已知的值初始化数组stdt[]的前3个元素,然后接下来的3个学生'将从用户输入填充信息。当我编译时,我收到错误:

lab7.c: In function ‘main’:

lab7.c:16:9: error: expected expression before ‘{’ token
 stdt[0]={"John","Bishop","s1234","Inf",'m',18};
         ^

lab7.c:17:9: error: expected expression before ‘{’ token
 stdt[1]={"Lady","Cook","s2345","Eng",'f',21};
         ^

lab7.c:18:9: error: expected expression before ‘{’ token
 stdt[2]={"James","Jackson","s33456","Eng",'m',17};
         ^

我该如何正确地做到这一点?

以下是目前的代码:

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    char *name;
    char *surname;
    char *UUN;
    char *department;
    char gender;
    int age;
} student_t;

int main() {
    int i;
    student_t stdt[6];
    stdt[0]={"John","Bishop","s1234","Inf",'m',18};
    stdt[1]={"Lady","Cook","s2345","Eng",'f',21};
    stdt[2]={"James","Jackson","s33456","Eng",'m',17};

    for(i=3;i<6;i++) {
        printf("First name: \n");
        scanf("%s",stdt[i].name);
        printf("Last name: \n");
        scanf("%s",stdt[i].surname);
        printf("UUN: \n");
        scanf("%s",stdt[i].UUN);
        printf("Department: \n");
        scanf("%s",stdt[i].department);
        printf("Gender (m/f): \n");
        scanf("%c",stdt[i].gender);
        printf("Age: \n");
        scanf("%d",stdt[i].age);
    }
    return 0;
}   

2 个答案:

答案 0 :(得分:8)

你没有&#34;初始化&#34;如果你不是在创作时做的话。你可以这样做:

student_t stdt[2] = { {"John", "Bishop", "s1234", "Inf", 'm', 18},
                      {"Lady", "Cook", "s2345", "Eng", 'f', 21}
                    };

与你一样多。

没有明确地为数组的每个成员提供值,这没关系。对于未明确初始化的指针成员,指针成员将隐式初始化为NULL,数字成员将隐式初始化为0。换句话说,这个:

student_t stdt[4] = { {"John", "Bishop", "s1234", "Inf", 'm', 18},
                      {"Lady", "Cook", "s2345", "Eng", 'f', 21}
                    };

相当于:

student_t stdt[4] = { {"John", "Bishop", "s1234", "Inf", 'm', 18},
                      {"Lady", "Cook", "s2345", "Eng", 'f', 21},
                      {NULL, NULL, NULL, NULL, 0, 0},
                      {NULL, NULL, NULL, NULL, 0, 0}
                    };

好奇的是,这些规则来自C标准如下。

从C11第6.7.9.21节:

  

如果括号括起的列表中的初始值设定项少于此值   是聚合的元素或成员,或者是一个或多个字符   string literal用于初始化已知大小的数组   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。

和&#34;与具有静态存储持续时间的对象相同&#34;我们有第6.7.9.10节:

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。如果一个对象有静态   或线程存储持续时间未明确初始化,然后:

     
      
  • 如果   它有指针类型,它被初始化为空指针;

  •   
  • 如果有的话   算术类型,它被初始化为(正或无符号)零;

  •   
  • 如果是聚合,则会初始化每个成员(递归)   根据这些规则,任何填充都被初始化为零位;

  •   
  • 如果是联合,则初始化第一个命名成员   (递归地)根据这些规则,并初始化任何填充   为零位;

  •   

struct是&#34;聚合&#34;在上面的第三个子弹的意义上。

答案 1 :(得分:2)

如果您使用C99&#39;复合文字&#39;

,您几乎可以完成所写的内容
stdt[0] = (student_t){ "John",  "Bishop",  "s1234",  "Inf", 'm', 18 };
stdt[1] = (student_t){ "Lady",  "Cook",    "s2345",  "Eng", 'f', 21 };
stdt[2] = (student_t){ "James", "Jackson", "s33456", "Eng", 'm', 17 };

但是,这是为数组赋值,而不是初始化数组。此外,由于数组是main()的本地数组,因此数组的其他三个元素中的值是不确定的;你不能假设他们。