Почему структуры остановлюсь в 0
Есть ли какое-либо окончательное руководство, которое говорит, что мы должны инициализировать структуру sockaddr_in до нуля по определенной причине?
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
Всякий раз, когда я смотрел в реальном коде или примере или книгах, он всегда имеет структуру кода, подобную следующей:
struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo));
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
Я понимаю, что некоторые источники говорят, что член char sin_zero[8]
существует для заполнения и должен быть установлен в ноль, но почему обнуление остальных. Особенно, когда они инициализируются в большинстве случаев в течение следующих нескольких строк объявления. Даже о члене sin_zero руководство по программированию beej говорит, что больше не обязательно обнулять их. Я искал объяснение, но ничего по существу не нашел. Этотвопрос переполнения стека имеет некоторые различные предложения по самой инициализации, но не объясняет, почему обнуление необходимо.
Это унаследованная практика или есть какая-то реальная причина, по которой я ее упускаю? Любая ссылка ценится.
1 ответ:
Думайте о нем как о конструкторе по умолчанию, то есть он инициализирует данные до известных значений (0 в данном случае). Это может помочь смягчить проблемы, связанные с неинициализированными данными при использовании Pod, например, забыть установить элемент, хотя
memset
на самом деле не обязательно, и вы можете просто инициализировать значение структуры с помощьюsockaddr_in foo{};
(Кстати, это также приводит к лучшему ассемблерному коду за кулисами, поскольку компилятор можетmovq 0
все вместо вызоваmemset
, не то, что это будет иметь большое значение в 99% случаев). дела).Если вы абсолютно уверены, что собираетесь установить все члены, то это не обязательно, хотя это может помочь поймать ошибки раньше, если вы забудете что-то инициализировать.