"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que modificar uma constante por meio de um ponteiro não const produz um comportamento indefinido?

Por que modificar uma constante por meio de um ponteiro não const produz um comportamento indefinido?

Publicado em 2024-11-07
Navegar:557

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

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:

  • Exibindo o valor apontado por w ( cout w
  • No entanto, exibir o valor de e (*cout

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.

Tutorial mais recente Mais>

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