Estou criando um array dinâmico em C. Também quero criar uma função que inicialize um determinado array dinâmico com um certo número de elementos. Porém, ao determinar o tamanho de cada elemento para a alocação de memória, não sei exatamente o que fazer.
Aqui está o meu código:
#define typedef_list(name, type) \
typedef struct { \
int cap; \
int n; \
type *items; \
} name;
#define list_init(list, cap) \
do { \
list.items = malloc(cap * sizeof(*list.items)); /* problem line */ \
list.cap = cap; \
} while (0);
#endif
Eu uso sizeof(*list.items)
para obter o tamanho do que está sendo apontado. Parece funcionar, pois a seguinte macro funciona para um determinado tipo:
#define list_test(list) do { printf("%lu\n", sizeof(*(list.items))); } while(0);
Isso é aceitável, já que a memória ainda não foi alocada tecnicamente? Meu palpite é que o compilador não está tentando acessar essa memória e apenas "sabe" o tamanho, mas está tudo bem?
Editar - aqui está o código que uso para testar isso:
typedef_list(dyn, uint16_t); // works with any given type
int main(void) {
dyn arr;
list_test(arr);
}
Para responder à pergunta específica: sim, não há problema em escrever
sizeof(*(list.items))
mesmo quelist.items
ainda não tenha sido alocado, pois o resultadosizeof
depende apenas do tipo do operando e o operando não é avaliado a menos que seja do tipo array de comprimento variável (o que não pode ser neste caso).Isso é especificado na Norma C17 6.5.3.4-2:
Na verdade, um método geral para obter o tamanho de um membro struct
M
de uma struct com tipoT
sem ter uma instância da struct é usarsizeof
um ponteiro nulo do tipoT *
como segue: