Я читаю файл, помещаю данные в буфер, например массив символов. После этого я копирую часть данных в структуру и увеличиваю смещение, чтобы прочитать следующую часть данных. Структура похожа на заголовок, член которого int dataSize может указывать переменный размер загружаемых данных после нее.
Буфер можно визуализировать следующим образом:
| headerA |
| dataLoad |
| dataLoad |
| dataLoad |
| headerB |
| dataLoad |
| dataLoad |
Что-то происходит, возможно, из-за несовпадения данных, и возникает сигнал SIGBUS. Часто ли используется выравнивание для выравнивания данных перед доступом к заголовку?
Вот моя простая программа, иллюстрирующая ситуацию:
#include
#include
#include
#include
using namespace std;
typedef struct HeaderA {
int dataSize;
char y;
int z;
} HeaderA; // 12 bytes after padding by compiler
typedef struct HeaderB{
char x;
int dataSize;
char z;
} HeaderB; // 12 bytes after padding by compiler
void copyHeaderA(HeaderA& dest, const char* src) {
memcpy(&dest, src, sizeof(HeaderA));
}
void copyHeaderB(HeaderB& dest, const char* src) {
memcpy(&dest, src, sizeof(HeaderB));
}
int main() {
char data[100]; // 100 bytes
HeaderA headerA;
int offset = 1; // intentionally put offset = 1 to cause mis-alignment when reading dataSize at HeaderA
if (offset + sizeof(HeaderA)
Подробнее здесь: https://stackoverflow.com/questions/791 ... saligned-d