suma - ¿Cuál es el propósito del calificador const si puedo modificarlo a través de un puntero en C?
que es un puntero en c++ (2)
Posible duplicado:
¿El malvado elenco es superado por el malvado compilador?
Hola,
Si puedo modificar una constante a través de un puntero, ¿cuál es el objetivo? A continuación está el código:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int a = 10;
int *p = (int *)&a;
printf("Before: %d /n", a);
*p = 2;
/*a = 2; gives error*/
printf("After: %d /n", *p);
return 0;
}
SALIDA:
Antes: 10
Después: 2
Pulse cualquier tecla para continuar . . .
Usando Visual Studio 2008.
Si puedo modificar una constante a través de un puntero, ¿cuál es el objetivo? abajo está el código:
Este es un comportamiento indefinido y debe evitarse a toda costa:
§ C99 6.7.3p5
Si se intenta modificar un objeto definido con un tipo const-qualified mediante el uso de un lvalue con un tipo no const calificado, el comportamiento no está definido .
La razón por la que puede modificar el valor es porque hizo una conversión de puntero que eliminó la const
:
int *p = (int *)&a;
Este typecasts a const int*
(a saber &a
) a un int *
, lo que le permite modificar libremente la variable. Normalmente, el compilador le advertiría sobre esto, pero el tipo de transmisión explícito suprimió la advertencia.
La razón principal detrás de const
es evitar que modifique accidentalmente algo que prometió no. No es sacrosanto, como lo han visto, y pueden deshacerse de la impunidad con consistencia, de la misma manera que pueden hacer otras cosas inseguras como convertir punteros en números enteros o viceversa. La idea es que debes hacer todo lo posible para no jugar con const
, y el compilador te avisará si lo haces. Por supuesto, agregar un yeso le dice al compilador "Sé lo que estoy haciendo" y, por lo tanto, en tu caso, lo anterior no genera ningún tipo de advertencia.