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

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

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

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

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

Общие новости:
10.02.2019, 21:59

Форум:
16.02.2019, 15:03

Последний вопрос:
20.02.2019, 01:19
Всего: 148782

Последний ответ:
19.02.2019, 15:57
Всего: 257802

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

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

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

Наша кнопка:

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

Отзывы о нас:
08.12.2010, 20:09 »
novij2011
спасибо за помощь [вопрос № 181114, ответ № 264596]
22.10.2011, 00:02 »
Чураков Алексей Витальевич
великолепно! [вопрос № 184304, ответ № 268550]

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

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

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

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

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 682
solowey
Статус: Студент
Рейтинг: 363
zdwork
Статус: 1-й класс
Рейтинг: 111

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

Консультация онлайн # 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.13662 сек.

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