我正在做一个简单的学生数据库程序练习,而且我不确定如何初始化一组结构。我尝试使用编译时已知的值初始化数组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;
}
答案 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()
的本地数组,因此数组的其他三个元素中的值是不确定的;你不能假设他们。