Considerando que o tipo A
é definido assim:
typedef struct a { const int a; } A;
Eu sei que este código é válido:
A * foo = malloc(sizeof *foo); // Allocates uninitialized memory with no effective type
memcpy(foo, &(typeof(*foo)){ .a = 42, }, sizeof *foo); // Effectively initialize the value once
(veja https://stackoverflow.com/a/79012045/13242312 )
Mas ainda é válido com alloca
instead of malloc
se quisermos que o valor esteja na pilha em vez do heap?
Caso de uso: Quero um único caminho de retorno em minha função, então quero definir a variável de resultado no escopo da função
A A_new(void) {
A * a = alloca(sizeof *a);
if (/* something */) {
memcpy(a, &(typeof(*a)){.a = 1}, sizeof *a);
} else {
memcpy(a, &(typeof(*a)){.a = 2}, sizeof *a);
}
return *a;
}
Nenhuma diferença de Alloca
O uso de
alloca
oumalloc
não tem efeito na semântica relevante, exceto quealloca
não é uma função padrão da biblioteca C.Sem preocupação com o tipo
Você pode evitar questões semânticas
const
não utilizando o tipo de destino ao preparar a memória. Por exemplo:O acesso à memória como tipo
T
nareturn
instrução é definido pelo padrão C porque a memória recebeu o tipo efetivoT
ao copiar nela os bytes de umT
objeto, então ela é acessada com seu tipo efetivo.Não há necessidade de alocação
Seu código de exemplo não ilustra a necessidade de usar alocação dinâmica, seja de
malloc
oualloca
. O corpo inteiro da função poderia ser apenas:Percebo que o código de exemplo pode estar simplificado demais, de modo que talvez
.a = something ? 1 : 2
seja necessário mais do que o necessário no código original. No entanto, a alocação dinâmica ainda pode ser evitada registrando os valores dos membros em seus próprios objetos ou em uma estrutura paralela semconst
membros, como: