Этот вопрос / проблема тесно связан с предыдущей проблемой, которой я поделился здесь.Однако ....
У меня довольно большой проект, для которого я выполняю модульное тестирование и интеграционное тестирование.К сожалению, я не могу поделиться кодом, кроме крошечных кусочков, и это было бы в любом случае для большого проекта.
Подведу итоги, в лучшем случае, я могу ... Тип определяется следующим образом:
typedef struct {
s32 s32IntLimitHigh;
s32 s32IntLimitLow;
s32 s32RegLimitHigh;
s32 s32RegLimitLow;
u16 u16IntGain;
u16 u16PropGain;
u16 u16IntStep;
BOOL BOOLFreeze;
} structPIreg;
Тип отдельных членов довольно понятен по их именам.
Два массива определены следующим образом:
structPIreg expected_VectParPI[VECT_PI_LENGTH];
structPIreg VectParPI[VECT_PI_LENGTH];
Поскольку это для модульного тестирования, у меня есть исходная переменная и ее ожидаемое значение.Массивы состоят из 8 элементов.
sizeof (VectParPI[1]) is 29 :
4 * s32 + 3 * u16 + BOOL = 4 * 4 + 3 * 4 + 1 = 29
u16 - 16 бит на оригинальной машине, здесьв архитектуре x86 это 32-битная версия.
Я компилирую, тесты выполняются, и я получаю странные результаты.Поэтому я начинаю сеанс отладки, и здесь все становится еще более странным.
Теперь проблема в том, что размер структуры двух переменных, кажется, отличается.И то, что я вижу на отладчике, соответствует.
Я опубликую две картинки окна переменных переменных, чтобы вы поняли.В этом окне наблюдения я вычисляю смещение в байтах между вторым и первым элементом двух массивов.
(char*)&VectParPI[1]-(char*)&VectParPI[0] long 32
(char*)&expected_VectParPI[1]-(char*)&expected_VectParPI[0] long 29
Наблюдать за окнами
Как видите, смещение отличается.Но я не могу понять, почему.Как в объектном файле могут отличаться смещение / размер двух разных переменных одного и того же типа?
Что более интригующе то, что когда я запускаю отладчик и gdb делает паузу на main, два размераявляются правильными (29 каждый).После того, как я установил точку останова где-нибудь, и при достижении точки прерывания я вижу размеры 32 и 29.
Как можно изменить адрес памяти?Это как структура перемещается в памяти.Я просто не могу понять, почему ....
В качестве "доказательства" того, что я не сплю, я прикрепляю то же самое окно с часами, что и раньше.Вы можете видеть, что eclipse / gdb выделил желтым цветом размер и смещение, потому что в какой-то момент они изменились с 29 на 32. Довольно забавно ....:)
подсвеченное окно просмотра