"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué parece funcionar la modificación de una variable `const` mediante un puntero no constante, pero en realidad no cambia su valor?

¿Por qué parece funcionar la modificación de una variable `const` mediante un puntero no constante, pero en realidad no cambia su valor?

Publicado el 2024-11-07
Navegar:493

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

Modificar una variable constante mediante un puntero no constante

En C, una variable constante no se puede modificar una vez inicializada. Sin embargo, en ciertos escenarios, puede parecer que se ha alterado una variable constante. Considere el siguiente código:

const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout 

Si ejecuta este código, notará un comportamiento inesperado:

5
2

Aunque *w se cambió a 5 en (2), e todavía mantiene su valor original de 2. Este comportamiento aparentemente paradójico se debe a los siguientes factores:

  • (1 ) Eliminar la referencia a un puntero constante (w) permite su modificación.
  • (2) El valor modificado se almacena en la ubicación de memoria señalada por w, que en este caso es la ubicación de memoria donde se almacena e.
  • Sin embargo, el compilador optimiza el código, tratando e como una constante de tiempo de compilación y no evaluándolo en tiempo de ejecución.

Como resultado, cuando *w se evalúa en tiempo de ejecución, devuelve el valor modificado (5). Sin embargo, cuando e se evalúa en tiempo de compilación, se utiliza su valor original (2).

Este comportamiento se conoce como comportamiento indefinido en C. Modificar una variable constante directa o indirectamente tiene consecuencias impredecibles y se debe tener precaución en tales situaciones.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3