Я написал достаточно простой распределитель памяти, используя sbrk. Я прошу кусок памяти, скажем, 65 КБ, и разделяю его по мере необходимости для переменных, запрашивающих динамическую память. Я освобождаю память, добавляя ее обратно в блок 65k. Блок размером 65 КБ получается из объединения sizeof(16 байт). Затем я выравниваю блок по ровной 16-байтовой границе. Но я получаю необычное поведение.
Доступ к памяти выглядит нормально, когда я выделяю и начинаю заполнять свои структуры данных, принимая, что при одном из вызовов моей функции я передаю указатель на переменную-член в глобальной структуре, но адрес аргумента указателя не сопоставляется непосредственно с адрес этого члена.
Например, реальный адрес этого конкретного члена: 0x100313d50, но при выполнении определенной функции (ничего особенного) адрес члена представляется как 0x100313d70. Внутри отладчика я могу запросить реальный адрес, и он кажется правильным, когда он находится внутри функции, в которой это проявляется. Это не первый доступ к члену, это третий, поэтому два предыдущих доступа к памяти в порядке, но во время третьего доступа я вижу это необычное смещение.
Возможно ли, что я обращаюсь к этой памяти через смещенный блок? Это возможно, но я ожидаю, что возникнет исключение SIGBUS (микросхема SPARC). Я компилирую с использованием -memalign=16s, поэтому он должен использовать SIGBUS, а не перехватывать и исправлять смещение.
Все мои структуры дополнены кратным 16 байтам: sizeof(structure)%16 = 0. Кто-нибудь сталкивался с таким поведением? Вообще говоря, какие вещи/вещи/и т.д. может привести к тому, что указатель исказит адрес памяти?
Здоровья, Трейси.
Solaris 10, SunStudio-12, язык C на современном процессоре SPARC (если это поможет).