19.05.2019, 20:43 [+3 UTC]
в нашей команде: 3 617 чел. | участники онлайн: 7 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.75 (18.05.2019)
JS-v.1.33 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
16.05.2019, 21:07

Последний вопрос:
19.05.2019, 18:12
Всего: 149645

Последний ответ:
19.05.2019, 16:03
Всего: 258485

Последняя рассылка:
19.05.2019, 15:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
09.03.2019, 21:14 »
dar777
Это самое лучшее решение! [вопрос № 194916, ответ № 277620]
10.11.2010, 18:36 »
Матвеев Денис Александрович
Большое спасибо, все работает. [вопрос № 180671, ответ № 263945]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 612
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 229
solowey
Статус: Практикант
Рейтинг: 229

Перейти к консультации №:
 

Консультация онлайн # 142074
Раздел: • С / С++
Автор вопроса: Warobushek
Отправлена: 24.08.2008, 08:07
Поступило ответов: 1

Уважаемые эксперты, в одном источнике увидел как написан макрос для определения смещения члена структуры в байтах.

#define	offsetof(type, mem) ((size_t) ( (char *)&((type *) 0)->mem - (char *)((type *) 0)))

Поясните, пожалуйста, смысл: нулевой указатель здесь преобразуется к типу type ? Что это дает?

Состояние: Консультация закрыта

Здравствуйте, Warobushek!

Если бы по нулевому адресу находилась структура типа type ,
то все, наверное, было бы понятно:

(char*)(type*) 0 - адрес структуры, т.е. начала области памяти, отведённой под неё.
&((char*)((type*) 0 -> mem)) - адрес её элемента mem ,
и, соответственно, смещение вычисляется как разность этих адресов.

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

Замечание.
Вместо (char*)(type*) 0 можно было бы написать просто (char*) 0 ,
но в выражении (type*)0->mem преобразование типа необходимо.
чтобы было известно, что 0 должен рассматриваться как адрес структуры определённого типа.

Пример использования макроса в приложении.

Приложение:

Последнее редактирование 24.08.2008, 11:27 [неизвестный]

Консультировал: Лангваген Сергей Евгеньевич (Академик)
Дата отправки: 24.08.2008, 10:43

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14296 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.75 от 18.05.2019
Версия JS: 1.33 | Версия CSS: 3.35