Enviado em 27/01/2013 - 09:02h
paulo1205 escreveu:
Na linha em que você faz *(long *)p = func;, você assume que o tamanho de um inteiro longo é igual ao tamanho de um ponteiro genérico, e atribui o valor de um ponteiro a um lvalue cujo tipo é long. A assunção não necessariamente é sempre verdadeira, e a confusão com os tipos, que decorre certamente da assunção sobre os tamanhos, é um tipo de coisa temerária que um compilador configurado corretamente não deveria deixar passar sem pelo menos dar uma mensagem de aviso.
Não só filosoficamente, mas até em termos práticos, seria melhor você fazer da seguinte forma: *(void **)p=func;, até porque func já é do tipo void *.
E, obviamente, também as linhasNa linha em que você faz *(long *)p = func;, você assume que o tamanho de um inteiro longo é igual ao tamanho de um ponteiro genérico, e atribui o valor de um ponteiro a um lvalue cujo tipo é long. A assunção não necessariamente é sempre verdadeira, e a confusão com os tipos, que decorre certamente da assunção sobre os tamanhos, é um tipo de coisa temerária que um compilador configurado corretamente não deveria deixar passar sem pelo menos dar uma mensagem de aviso.
Não só filosoficamente, mas até em termos práticos, seria melhor você fazer da seguinte forma: *(void **)p=func;, até porque func já é do tipo void *.
p+=sizeof(long);deveriam ser trocadas para
len+=sizeof(long);
p+=sizeof func;(sendo p um ponteiro para caracteres).
len+=sizeof func;