Estou usando a versão mais recente do g++ para compilar um código de teste envolvendo um array de ponteiros struct onde os structs contêm um array. A compilação falha quando tento inicializar o array de ponteiros struct em uma linha, mas se eu atribuir os structs a variáveis e então pegar seus endereços ao criar o array, o g++ não reclama. Quero entender o porquê. Este é meu primeiro post, então peço desculpas se houver informações faltando.
Procurei por perguntas semelhantes e não encontrei nada tão específico.
#include <stdint.h>
typedef struct {
uint16_t num_elements;
uint8_t elements[];
} HasArray;
HasArray x = {.num_elements = 2, .elements = {51, 17}};
HasArray y = {.num_elements = 4, .elements = {1, 42, 88, 73}};
const HasArray* collection[] = {&x, &y};
// main() somewhere
O código acima funciona, o que eu presumo que seja porque o g++ pode alocar memória para x
e y
em tempo de compilação (ou algo similar). Se eu tentar inicializar collection
assim:
// HasArray cast is necessary so I can take the address, doing `&` on just the `{}`
// didn't work
// Also I would use a macro for these declarations, I know it's clunky
const HasArray* collection[] = {
&(HasArray){.num_elements = 2, .elements = {51, 17}},
&(HasArray){.num_elements = 4, .elements = {1, 42, 88, 73}}
};
g++ lança
test.c:16:56: error: non-static initialization of a flexible array member
16 | &(HasArray){.num_elements = 2, .elements = {51, 17}},
| ^
test.c:17:63: error: non-static initialization of a flexible array member
17 | &(HasArray){.num_elements = 4, .elements = {1, 42, 88, 73}}
| ^
O que torna essas situações diferentes? No meu cérebro, a segunda sintaxe ainda alocará memória em tempo de compilação, mas parece que não é o caso. Eu entendo que eu poderia alocar memória em tempo de execução com malloc()
, mas a primeira situação não requer isso e eu sei o tamanho das structs em tempo de compilação, então como posso indicar o tamanho para o compilador sem criar variáveis separadas para cada struct?
Editar: Eu de fato marquei a pergunta incorretamente, opa. Isso é para código c, mas tenho que usar g++ para compilá-lo. @ChrisMM forneceu uma resposta muito boa nos comentários. Para contornar o erro, atribuirei os arrays a variáveis e pegarei seus endereços como na primeira situação.