Почему структуры остановлюсь в 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 8

1 ответ:

Думайте о нем как о конструкторе по умолчанию, то есть он инициализирует данные до известных значений (0 в данном случае). Это может помочь смягчить проблемы, связанные с неинициализированными данными при использовании Pod, например, забыть установить элемент, хотя memset на самом деле не обязательно, и вы можете просто инициализировать значение структуры с помощью sockaddr_in foo{}; (Кстати, это также приводит к лучшему ассемблерному коду за кулисами, поскольку компилятор может movq 0 все вместо вызова memset, не то, что это будет иметь большое значение в 99% случаев). дела).

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