Прежде всего, вы производите индивидуальные адреса до int
. Я не думаю, что это такая хорошая идея. должно быть не менее int
. байт или более размер, адрес/указатель обычно 4 или 8 байтов. Отливка их до int
просто не подходит. Если бы я их бросил, я бы использовал unsigned long
для 32-битных систем и unsigned long long
для 64 бит. Я бы использовал последнее, чтобы быть в безопасности.
Тем не менее, я бы не выбрал адреса вообще и просто использовал макрос offsetof
.
Добавить #include <stddef.h>
в файл и использовать offsetof
макрос, который отбрасывает значение смещения для size_t
типа, а не как int
, заметьте.Он работает, просто используя 0 в качестве адреса памяти в структуры, а затем возвращает адрес данного элемента, что дает фактическое смещение:
size_t offset = offsetoff(T1, c);
//struct, member
Как Zack отметил в своем комментарии, следующую часть ответа не имеет значения, но для ссылок, которые он содержит, и для полноты я просто оставлю его здесь, поскольку offsetof
требуется из всех реализаций:
Определите макрос самостоятельно, если вы его не используете По какой-то причине у меня есть stddef.h (что должно быть, потому что offsetof
был частично стандартным в течение некоторого времени: C89 и выше), например так:
#ifndef offsetof
#define offsetof(s, m) ((size_t)&(((s *) 0)->m))
#endif
Это должно сделать трюк, но будьте осторожны: эта реализация может привести к непредсказуемому поведению. How and why is explained here
Я принял определение offsetof
от the stddef.h source I found here, поэтому вы можете просто загрузить этот файл и использовать его вместо того, чтобы определять макрос в своем собственном файле, но имейте в виду, что используемый вами offsetof
не на 100% надежный.
Во всяком случае, этого достаточно на данный момент, больше информации на Google, но вот несколько ссылок:
Определить поддельный указатель и посмотреть? – Cthulhu
На это, вероятно, ответили здесь и обсудили в другом месте миллион раз. Я предполагаю, что ответ должен был искать Google. Вы Google это? –
Если ваша структура действительно такая большая, то ее листинг, а адрес одного из ее членов в 'int', скорее всего, вызовет у вас горе (указатели составляют 4/8 байт,' int' должен быть только 2 байты в размере, но большинство реализаций используют 4 байта) –