在C中初始化结构数组

pix*_*ure 3 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};
         ^
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能正确?

这是迄今为止的代码:

#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;
}   
Run Code Online (Sandbox Code Playgroud)

Cro*_*man 8

如果你在创作时没有这样做,你就不会"初始化".你可以做:

student_t stdt[2] = { {"John", "Bishop", "s1234", "Inf", 'm', 18},
                      {"Lady", "Cook", "s2345", "Eng", 'f', 21}
                    };
Run Code Online (Sandbox Code Playgroud)

尽可能多的.

没有为数组的每个成员显式提供值是可以的.对于未显式初始化的指针成员,指针成员将被隐式初始化为NULL,并且数值成员将被隐式初始化为0.换句话说,这个:

student_t stdt[4] = { {"John", "Bishop", "s1234", "Inf", 'm', 18},
                      {"Lady", "Cook", "s2345", "Eng", 'f', 21}
                    };
Run Code Online (Sandbox Code Playgroud)

相当于:

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}
                    };
Run Code Online (Sandbox Code Playgroud)

对于好奇,这些规则来自C标准如下.

从C11第6.7.9.21节:

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

对于"与具有静态存储持续时间的对象相同",我们有6.7.9.10节:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:

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

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

  • 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;

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

A struct是上面第三个子弹意义上的"聚合".