C: выравнивание структур данных

Я работаю со структурами и у меня есть несколько вопросов о них. Как я понимаю, структурные переменные будут размещаться в памяти последовательно. Длина блоков (слов) зависит от архитектуры машины (32 бита - 4 байта, 64 бита - 8 байтов).

Допустим, у нас есть 2 структуры данных:

struct ST1 {
    char c1;
    short s;
    char c2;
    double d;
    int i;
};

В памяти это будет:

32 bit - 20 bytes    
 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
 c1| PB| s | s | c1| PB| PB| PB| d | d | d  | d  | d  | d  | d  | d  | i  | i  | i  | i  |

64 bit - 24 bytes    | 20 | 21 | 22 | 23 |
previous sequence +  ---------------------
                     | PB | PB | PB | PB |

Но мы можем изменить его, чтобы эти данные вписались в машинное слово. Нравится:

struct ST2 {
    double d;
    int i;
    short s;
    char c1;
    char c2;
};

В этом случае как для 32-разрядного, так и для 64-разрядного он будет представлен одинаково (16 байт):

 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
 d | d | d | d | d | d | d | d | i | i | i  | i  | s  | s  | ch1| ch2|

У меня есть пара вопросов:

Это как дикая догадка, но главное правило дляstruct это определить переменные с большим размером в начале?Как я понимаю, он не работает с автономными переменными. подобноchar str[] = "Hello";?Заполняющий байт, какой у него код? Это где-то за столом ASCII? Извините, не смог найти это.2 структуры со всеми членами, представленными в памяти разными адресами, и они могут быть размещены не последовательно в памяти?Такая структура:struct ST3 { char c1; char c2; char c3;} st3; имеетsize = 3Я понимаю, что если мы добавим в него члена с другим типом, он будет выровнен. Но почему это не выровнено перед этим?

Ответы на вопрос(5)

Ваш ответ на вопрос