Почему не дополнение байта, произошедшее в этой программе C?

According to byte padding, in 32 bit OS, the CPU can address memory in multiple of 4 as given here when the computer's word size is 4 bytes (a byte meaning 8 bits), the data to be read should be at a memory offset which is some multiple of 4. When this is not the case, e.g. the data starts at the 14th byte instead of the 16th byte, then the computer has to read two 4-byte chunks and do some calculation before the requested data has been read, or it may generate an alignment fault. Even though the previous data structure ends at the 14th byte, the next data structure should start at the 16th byte. Two padding bytes are inserted between the two data structures to align the next data structure to the 16th byte.

#include
struct test {
        char a;
        char b;
        int c;
        int d;
};
void main() {
        int a,b;
        char c,d;
        printf("Address of a & b = %u & %u respectively\n",&a,&b);
        printf("Address of c & d = %u & %u respectively\n",&c,&d);      
        struct test t1;
        printf("The size of structure:::%d\n",sizeof(t1));
}

Продукция:

Address of a & b = 3216087804 & 3216087808 respectively
Address of c & d = 3216087802 & 3216087803 respectively
The size of structure:::12

В то время как, когда я объявил структуру таким образом:

struct test {
        char a;
        int b;
        int c;
        char d;
};

Продукция в этом случае:

The size of structure:::16

Почему ошибка выравнивания не произойдет, когда мы попытаемся получить доступ к secord переменной случайной работы в странном местоположении в памяти или переменной, которая не является, существуют по адресу, который находится в кратном числе 4?

0
nl ja de

1 ответы

Дополнение делается в обоих случаях. В коде вы, если, обугливаются b , не требуете никакого дополнения и таким образом не получаете ни один. интервал c требует двух байтов дополнения (я принимаю типичные правила x86) и получает его. Общее количество sizeof структура составляет 10 байтов данных + 2 байта дополнения для обозначенных 12 байтов.

В отдельном случае интервал b требует трех байтов дополнения, и структура в целом требует, чтобы еще три, чтобы поместить <закодировали> случайную работу на 4-байтовом граничном адресе. 10 байтов данных + 3 + 3 байта дополнения дают 16 байтов.

0
добавлено
Начиная с моего процессора can' t адрес, который не находится в кратном числе 4, тогда как к случайной работе b получают доступ в памяти, она должна вызвать ошибку выравнивания? Пожалуйста, исправьте меня.
добавлено автор SeasonedNoob, источник