struct Node {
Node *left;
Node *right;
int height;
char data[];
};
É assim que eu costumava definir os nós da minha estrutura de dados. Acho muito útil porque posso incorporar os dados diretamente no nó; caso contrário, teria que usar um void*, o que implicaria em outro malloc e outra camada de indireção. No entanto, li que há dois problemas com esse tipo de código:
Alinhamento
Digamos que eu tenha uma função que copia alguns dados para o array de dados com memcpy. Se esses dados forem um "long" (longo), por exemplo, eles estariam desalinhados.
_Alignas(max_align_t) char data[];
consertar o problema?
Aliasing estrito
A questão é: contanto que eu acesse o array de dados com um ponteiro para um tipo que coincide com o tipo do objeto do qual copiei, a regra de aliasing estrito é obedecida, mesmo que eu teoricamente acesse um array de caracteres por meio de um ponteiro int, por exemplo? Este foi o único caso em que tive que lidar com código do tipo trocadilho.