数组C中的结构初始化行为

数组C中的结构初始化行为,c,structure,C,Structure,我在test.c文件中有一段简单的代码: #include <stdio.h> #include <string.h> struct Student { char name[10]; int grade; }; int main(){ struct Student s = {.name = "Joe", .grade = 10}; //correct struct Student students[10]; student

我在test.c文件中有一段简单的代码:

#include <stdio.h>
#include <string.h>

struct Student {
    char name[10];
    int grade;
};

int main(){

    struct Student s = {.name = "Joe", .grade = 10}; //correct

    struct Student students[10];

    students[0] = {.name = "John", .grade = 10}; //error

    students[1] = s; //correct

    struct Student some_other_students[] = {
        {.name = "John", .grade = 10}
    }; //correct

    students[2].grade = 8;
    strcpy(students[2].name, "Billy"); //correct?!? O_o


    return 0;
}
数组是否应该在
students[0]={.name=“John”,.grade=10}处正确初始化?。以这种方式初始化时:
struct Student s={.name=“Joe”,.grade=10}
然后将其设置为如下数组
students[1]=s我没有错误。这只是一个假设,但可能是
{.name=“Joe”,.grade=10}
表达式在内存中没有引用,而结构数组只是对已初始化结构的引用数组吗


但是,如果数组只是初始化结构的引用,那么该如何工作呢<代码>学生[2]。成绩=8

您只能在定义变量时初始化变量。定义变量后,在为变量赋值时不能使用与初始化时相同的语法。尝试分配给数组元素并不重要,重要的是使用分配而不是初始化

尽管如此,还是有一种方法可以解决这个问题,即使语法有点笨拙(IMO),那就是使用它创建一个临时虚拟结构对象,并将其复制到变量:

students[0] = (struct Student){.name = "John", .grade = 10};
以上相当于

{
    // Define and initialize a "temporary" Student structure object
    struct Student temp = {.name = "John", .grade = 10};

    // Assign it to students[0]
    students[0] = temp;
}
或者,您可以在定义阵列时对其进行初始化:


您只能在定义变量时对其进行初始化。定义变量后,在为变量赋值时不能使用与初始化时相同的语法。尝试分配给数组元素并不重要,重要的是使用分配而不是初始化

尽管如此,还是有一种方法可以解决这个问题,即使语法有点笨拙(IMO),那就是使用它创建一个临时虚拟结构对象,并将其复制到变量:

students[0] = (struct Student){.name = "John", .grade = 10};
以上相当于

{
    // Define and initialize a "temporary" Student structure object
    struct Student temp = {.name = "John", .grade = 10};

    // Assign it to students[0]
    students[0] = temp;
}
或者,您可以在定义阵列时对其进行初始化:


分配不是初始化。但是,您可以在赋值中使用复合文字。。。。这看起来像:
{students[0]=(struct Student){.name=“John”,.grade=10};}
外部的花括号是可选的。它们只是限制了复合文本的生存期。事实上,(struct Student){.name=“John”,.grade=10}没有给出任何错误。。。但我的问题是没有理由的吗?编译器难道不应该知道struct Student的数组也可以被分配这样的结构吗?分配不是初始化。但是,您可以在赋值中使用复合文字。。。。这看起来像:
{students[0]=(struct Student){.name=“John”,.grade=10};}
外部的花括号是可选的。它们只是限制了复合文本的生存期。事实上,(struct Student){.name=“John”,.grade=10}没有给出任何错误。。。但我的问题是没有理由的吗?编译器难道不应该知道struct Student的数组也可以被分配这样的结构吗?正确。就像alk和EOF在上面的评论中回答的那样。仍然不知道为什么学生[2]。成绩=8;工作,因为这只是一项任务。但这是另一个问题。我问的问题得到了回答,所以我给它打了标记。@venge
students[2]。grade
基本上是一个简单的
int
变量。你可以像分配其他变量一样分配给它
告诉编译器应该如何处理数组指向的内存。应该像对待struct Student一样对待它,并期望有一个整数和一个字符[10]。在OOL
{.name=“John”,.grade=10}
中,这应该已经具有要分配给该变量的struct Student属性。但在C中,它可以用作赋值,但没有其他有效用途。这对我来说很难接受!对的就像alk和EOF在上面的评论中回答的那样。仍然不知道为什么学生[2]。成绩=8;工作,因为这只是一项任务。但这是另一个问题。我问的问题得到了回答,所以我给它打了标记。@venge
students[2]。grade
基本上是一个简单的
int
变量。你可以像分配其他变量一样分配给它
告诉编译器应该如何处理数组指向的内存。应该像对待struct Student一样对待它,并期望有一个整数和一个字符[10]。在OOL
{.name=“John”,.grade=10}
中,这应该已经具有要分配给该变量的struct Student属性。但在C中,它可以用作赋值,但没有其他有效用途。这对我来说很难接受!