Modificando uma constante por meio de um ponteiro não const: investigando o comportamento indefinido
No trecho de código fornecido, você expressa confusão sobre o comportamento de modificar um número inteiro constante (e) através de um ponteiro não const (w):
const int e = 2;
int* w = (int*) &e; // Casting to remove const-ness
*w = 5; // Modifying the value pointed to by w
Após fazer esta modificação, você observa que:
Você percebe ainda que o endereço apontado por w é o mesmo que o endereço de e (cout cout e permanece inalterado apesar da modificação feita por meio de w.
Esse comportamento decorre do comportamento indefinido que surge ao modificar uma constante por meio de um não -ponteiro const. Depois de fazer tal modificação, o código entra em território de comportamento indefinido, onde se torna imprevisível e depende de detalhes específicos de implementação.
Nesse caso, parece que a modificação por meio de w afeta um cópia temporária de e em tempo de execução, enquanto o e original permanece inalterado. A razão para isso é que e é tratado como uma constante de tempo de compilação e seu valor é codificado no código binário. Portanto, quaisquer modificações de tempo de execução em w não afetarão o e.
Este comportamento é específico da implementação usada e não deve ser considerado confiável. Modificar dados constantes por meio de ponteiros não const é considerado uma má prática e deve ser evitado. A abordagem correta é usar uma referência não const ou criar uma cópia não const dos dados que você pretende modificar.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3