Aritmética do ponteiro quando vazio possui tamanho desconhecido [fechado]
No Visual Studio C ++ versão 9 (e provavelmente outras versões também), o código a seguir:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Este código funciona no GCC, que tratasizeof(void)
Como1
.
Existe alguma maneira de contornar essa limitação, como elenco explicitamente parachar *
para efeitos de cálculo, a aritmética aumenta a confusão (void *
é bem reconhecido e usado como um ponteiro sem tipo para a memória bruta).
sizeof(void)
para mostrar que estou bem ciente do fato de que não é1
é a causa do problema.O exemplo de código é simplesmente demonstrar o que é necessário para gerar os erros.Eu sei que isso não é uma maneira "normal" de usarvoid
, mas isso é C, e essas coisas acontecem.Sim, as pessoas precisam fazer isso em baixo nível. Eu não estou atrás do porque, eu sou depois de como. Se você quer saber por quê, dê uma olhada em alguma fonte do kernel, ou no seu amigável glibc.Update1Parece que esta questão gerou uma grande confusão. A questão não é sobreporque tendosizeof(void) == 1
não é padrão, mas o que fazer quando não é.
Na instância em que a aritmética de ponteiro de byte único deve ser feita, verifica-se quechar *
é a resposta correta, não porque*(void *)
não tem tamanho, mas porque o padrão realmente garante que*(char *)
é sempre1
. Portanto, o uso dechar *
está sempre correta e congruente comvoid *
com a extensão GCC para fins de aritmética de ponteiros brutos.
Para reforçar ainda mais o ponto,void *
é a escolha correta para ponteiros para memória sem tipo, echar *
é o tipo correto para converterpara aritmética de ponteiros brutos.