инициализация переменной структуры

Я попытался инициализировать переменную struct следующим образом:

struct Abc{ char str[10]; }; int main(){ struct Abc s1; s1.str="Hello"; //error } 

Я понимаю это поведение, потому что оно такое же, как

 char str[10]; str="Hello"; // incompatible types 

Но посмотрите на следующие инициализации

 struct Abc s1={"Hello"}; //This is fine struct Abc s2={.str="Hello"}; //This is also fine 

Я помню, что в своем выпуске я читал много текстовых книг, в которых говорилось, что обе эти инициализации – одно и то же (т.е. инициализация структурных переменных с использованием {} нотации и явным использованием (.) Оператора – это одно и то же). Но выше обсуждения доказывает, что они не одни и те же.

Мой вопрос в том, что такое различие между этими инициализациями?

Разница в том, что эти две линии

 struct Abc s1={"Hello"}; //This is fine struct Abc s2={.str="Hello"}; //This is also fine 

являются инициализацией , тогда как

 s1.str="Hello"; 

является присвоением . Вы можете инициализировать массив символов в строковый литерал, но не через назначение.

Эта struct Abc s2={.str="Hello"}; можно назвать назначенной инициализацией, тогда как struct Abc s1={"Hello"}; общая инициализация.

Позвольте мне объяснить преимущество этой назначенной инициализации примером.

Предположим, что структура имеет переменную типа struct ex{ char *name; int age; char *city; char *country } struct ex{ char *name; int age; char *city; char *country } struct ex{ char *name; int age; char *city; char *country } . В этом случае, если вы хотите инициализировать, может использоваться только назначенная инициализация города и страны. Но в случае общей инициализации каждый член должен быть инициализирован отдельно. Это тоже накладные расходы для программиста и комплекса.

Следующие операторы присваивания точно такие же (но неправильные):

s1.str="Hello"; & str = "Hello"; ,

Разница только в том, что первая – это строка внутри struct .

И, кстати, инициализация означает присвоение значения переменной во время ее определения .

struct Abc s1; объявляет и определяет s1 поэтому вы инициализируете его здесь как:

 struct Abc s1={"Hello"}; //This is fine struct Abc s2={.str="Hello"}; //This is also fine 

Делая это

 struct Abc s1; s1.str="Hello"; 

не является инициализацией , он просто присваивает константный строковый литерал указателю на строку, который несовместим.