Почему все элементы структуры инициализируются в 0, когда мы просто инициализируем 1 член из 3, например - PullRequest
2 голосов
/ 24 февраля 2011

Например:

typedef struct student { 

     int rollno;
     float cgpa;
     char name[20];

}Student;

Student me= {0,0}; // will intilize name with all zeros

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011

Так оно и есть. Это стандартное ожидаемое поведение. То же самое с массивами. Э.Г.

int a[3] = {1}; // a is {1, 0, 0}
int a[3];       // a is {undefined, undefined, undefined}    

Что касается логического обоснования, я думаю, что оно должно было сохранить структуру либо полностью инициализированной, либо не совсем ... может быть:)

1 голос
/ 24 февраля 2011

Распространенным заблуждением является то, что Something x = {0}; должен инициализировать все элементы одним и тем же значением.

Стандарт C гласит, что если все элементы в «агрегате» (массивы, структуры и т. Д.) Не инициализируются явно, то остальные значения следует инициализировать так, как если бы они имели статическую продолжительность хранения.

И все элементы, которые имеют статическую длительность хранения, то есть те, которые объявлены с ключевым словом static и со всеми глобальными переменными, должны быть инициализированы нулем, если программист не инициализировал их явно.

Так в вашем примере "rollno "и" cgpa "инициализируются явным образом, в этом случае равными нулю, а остальная часть структуры инициализируется так, как если бы она имела статическую продолжительность хранения, то есть она также будет равна нулю.

0 голосов
/ 24 февраля 2011

Как только вы инициализируете одно поле структуры, вся переменная переходит в раздел со всеми другими инициализированными значениями.Таким образом, все поля инициализируются, потому что этот раздел реализован в исполняемом файле как байтовый массив.

Что касается значения, равного 0, я предполагаю, что это потому, что 0 имеет больше шансов вызвать исключение при использовании переменнойнеинициализированный.Считайте деление на ноль или исключение NULL-указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...