Я думаю, вы обнаружите, что это нарушение стандарта C (и, вероятно, C99). malloc () гарантирует возврат памяти с соответствующим выравниванием, так что вы можете сделать что-то вроде
struct DataA * foo = (struct DataA *)malloc(sizeof(struct DataA));
foo->x = 10;
Однако существуют требования по выравниванию, поэтому не гарантируется, что вы можете произвольно изменить указатель и заставить его работать.
Тем не менее, ОС может разрешить неправильный доступ к памяти, перехватывая исключение и выполняя доступ к памяти вручную. На PowerPC ЦП обрабатывает смещенные целочисленные обращения, но ожидает, что ОС будет обрабатывать смещенные обращения с плавающей запятой.
Наконец, вам может удастся заставить его работать, используя расширение GCC __attribute__((packed))
:
struct foo {
...
} __attribute__((packed));
Это имеет два эффекта:
- Переменные в структуре имеют выравнивание 1 (это может изменить макет памяти вашей структуры)
- Структура имеет выравнивание 1 (т. Е. Компилятор больше не будет выравнивать его, например, когда вы вставляете его в другую структуру)
Это может означать, что GCC генерирует код, необходимый для выполнения некорректной загрузки. Но почему вы хотите это сделать?