В настоящее время я читаю Expert C Programmign - Deep C Secrets. На странице 164, где автор объяснял ошибку шины и ошибку сегментации, он показал эту строку кода.
union {
char a[10];
int i;
} u ;
int * p = ( int * ) &(u.a[1]);
*p = 17; /* the misaligned addr in p causes a bus error */
Предполагается, что приведенный выше код вызывает ошибку шины, но когда я запустил его, он работал нормально без каких-либо ошибок. Автор дал следующее пояснение
Это вызывает ошибку шины, потому что объединение массива/целого числа гарантирует, что массив символов «а» также находится по разумно выровненному адресу для целого числа, поэтому «а+1» определенно нет. Затем мы пытаемся сохранить 4 байта в адресе, который выровнен только для однобайтового доступа. Хороший компилятор предупредит о неправильном выравнивании, но он не может определить все случаи.
Мое понимание приведенного выше утверждения состоит в том, что char
составляет 1 байт, и мы пытаемся поместить int
, который составляет 4 байта, в индекс char a[10]
, поэтому произойдет ошибка шины (я не уверен, что мое понимание правильное или неправильное)
Мой вопрос в том, почему приведенный выше код не вызывает ошибку шины.
Примечание. Я не изучаю информатику, поэтому помогут простые объяснения.
Примечание. Вопрос, похожий на этот вопрос, уже задавался, но я касаюсь только приведенного выше блока кода.
a
был указателем (например,char *a;
). В любом случае у вас естьi
, который занимает примерно 1/2 доступного хранилища, но если вы изменилиi
в этом случае на значение за пределами вашего действительного блока памяти - ошибка шины/segfault. - person David C. Rankin   schedule 24.12.2018