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

复仇

我在文件 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;
}

编译后出现此错误

test.c|14|error: expected expression before '{' token|

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

但话说回来,如果数组只是初始化结构的引用,这如何工作?students[2].grade = 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;
}

或者您可以在定义数组时对其进行初始化

struct Student students[10] = {
    {.name = "John", .grade = 10}
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章