Как инициализировать массив структур в C

#c #struct

#c #структура

Вопрос:

Я не понимаю, почему мой код не работает

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

typedef struct date{
    int month, day, year;
} Date;

typedef struct person{
    char name[32];
    Date date;
}Person;

int main()
{
    Person presidents[4];
    presidents[0] = {"George Washington", {30, 4, 1789}};
    presidents[1] = {"Thomas Jefferson", {4, 3, 1801}};
    presidents[2] = {"Abraham Lincoln", {4, 3, 1861}};
    presidents[3] = {"Theodore Roosevelt", {14, 8, 1901}};

    return 0;
}
 

Это результат компилятора:

 >||=== Build: Debug in MyProject (compiler: GNU GCC Compiler) ===|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c||In function 'main':|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|16|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|17|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|18|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|19|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|15|warning: variable 'presidents' set but not used [-Wunused-but-set-variable]|
>||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
 

Ответ №1:

Попробуйте:

 Person presidents[] = {
    {"George Washington", {30, 4, 1789}},
    {"Thomas Jefferson", {4, 3, 1801}},
    {"Abraham Lincoln", {4, 3, 1861}},
    {"Theodore Roosevelt", {14, 8, 1901}}
};
 

Инициализация всегда выполняется в форме

 type var = init_val;
 

и приведенный выше код показывает, как инициализировать массив структур. Пожалуйста, обратите внимание, что вам не нужно указывать количество элементов presidents массива, поскольку компилятор получит его из количества элементов в инициализаторе.

Комментарии:

1. @BUG вы можете использовать составные литералы (как предложил DavidRanieri), но технически это был бы набор назначений, а не инициализация. Вы не можете делать так, как делали … потому что синтаксис C запрещает это.

Ответ №2:

В качестве дополнения к ответу @RobertoCaboni, начиная с C99, вы также можете использовать составные литералы:

 Person presidents[4];
presidents[0] = (Person){"George Washington", {30, 4, 1789}};
presidents[1] = (Person){"Thomas Jefferson", {4, 3, 1801}};
presidents[2] = (Person){"Abraham Lincoln", {4, 3, 1861}};
presidents[3] = (Person){"Theodore Roosevelt", {14, 8, 1901}};
 

Комментарии:

1. 1, хотя технически это скорее присвоение, чем инициализация. Но это правильно, поскольку я предполагаю, что ОП имел в виду вопрос о задании в целом.