Как посчитать размер конструкции? - PullRequest
0 голосов
/ 07 декабря 2018

В man unix (7) я нашел следующее:

путь: сокет домена UNIX может быть привязан к файлу файловой системы с нулевым символом в конце, используя bind (2)).Когда возвращается адрес сокета пути (одним из системных вызовов, указанных выше), его длина составляет

offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1

struct sockaddr_un определяется как

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[108];            /* pathname */
};

Так что я бы предположил, что мы можем просто сделать strlen(sun_path) + sizeof(sun_family) Я не понимаю +1, которые они добавили.Можете ли вы дать объяснение?Я понимаю, что offsetof использует для переноса, как описано

В Linux вышеприведенное выражение offsetof() соответствует тому же значению, что и sizeof(sa_family_t), но некоторые другие реализации включают другие поля перед sun_path, поэтомувыражение offsetof() более переносимо описывает размер структуры адреса.

Но это +1 мне не понятно.

1 Ответ

0 голосов
/ 07 декабря 2018

Как рассчитать размер структуры?

Размер структуры sizeof(struct sockaddr_un).


Я не понимаю +1, который они добавили.Не могли бы вы дать объяснение?

Здесь код пытается определить длину данных , используемых (или используемых) в структуре.

offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
  1. offsetof(struct sockaddr_un, sun_path) Это смещение, но не включая элемент .sun_path.Это худший результат расчета данных потребностей предыдущих членов и предшествующего заполнения.

  2. strlen(sun_path) - длина строки без нулевого символа в .sun_path[].Если sun_path не содержит нулевой символ , результат будет неопределенное поведение (UB).

  3. +1 для предполагаемого нулевой символ в sun_path.

Такой расчет полезен для отправки данных в struct sockaddr_un где-нибудь как данные потребности могут быть значительно меньше, чем структура потребности.


Я бы предположил, что мы можем просто сделать strlen(sun_path) + sizeof(sun_family)

Это проблема (в зависимости от использования), поскольку

1) Не содержит нулевой символ .

2) Не учитываетдля потенциального заполнения между элементами .sun_family и .sun_path.Хотя в этом случае я был бы удивлен, увидев.

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