C: alinhamento de estruturas de dados
Estou trabalhando com estruturas e tenho várias perguntas sobre elas. Pelo que entendi as variáveis de estrutura serão colocadas na memória sequencialmente. O comprimento dos blocos (palavras) depende da arquitetura da máquina (32 bits - 4 bytes, 64 bits - 8 bytes).
Vamos dizer que temos duas estruturas de dados:
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
Na memória será:
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 |
Mas podemos reorganizá-lo, para que esses dados se encaixem na palavra da máquina. Como isso:
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
Neste caso, para 32 e 64 bits, ele será representado da mesma forma (16 bytes):
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|
Eu tenho algumas perguntas:
É como um palpite, mas a regra principal parastruct
é definir variáveis com tamanho maior no início?Pelo que entendi, não está funcionando com variáveis independentes. Gostarchar str[] = "Hello";
?Preenchendo byte, que código tem? Está em algum lugar na mesa ASCII? Desculpe, não consegui encontrar.2 estruturas com todos os membros representados na memória por diferentes endereços e eles podem ser colocados não sequencialmente na memória?Essa estrutura:struct ST3 { char c1; char c2; char c3;} st3;
Temsize = 3
Eu entendo que, se adicionarmos um membro com outro tipo, ele será alinhado. Mas por que não está alinhado antes disso?