Modificación de una constante mediante un puntero no constante: profundizar en un comportamiento indefinido
En el fragmento de código proporcionado, expresa confusión sobre el comportamiento de modificar un entero constante (e) a través de un puntero no constante (w):
const int e = 2;
int* w = (int*) &e; // Casting to remove const-ness
*w = 5; // Modifying the value pointed to by w
Después de realizar esta modificación se observa que:
Además, observa que la dirección señalada por w es la misma que la dirección de e (cout cout e permanece sin cambios a pesar de la modificación realizada a través de w.
Este comportamiento surge del comportamiento indefinido que surge al modificar una constante a través de una no definida. -puntero constante. Una vez que realiza dicha modificación, el código ingresa a un territorio de comportamiento indefinido, donde se vuelve impredecible y depende de detalles de implementación específicos.
En este caso, parece que la modificación a través de w afecta a copia temporal de e en tiempo de ejecución, mientras que el e original permanece sin cambios. La razón de esto es que e se trata como una constante de tiempo de compilación y su valor está codificado en el código binario. Por lo tanto, cualquier modificación del tiempo de ejecución de w no afectará el e original.
Este comportamiento es específico de la implementación utilizada y no se debe confiar en él. La modificación de datos constantes mediante punteros no constantes se considera una mala práctica y debe evitarse. El enfoque correcto es utilizar una referencia no constante o crear una copia no constante de los datos que desea modificar.
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