Confusión con respecto a la modificación de la variable const usando punteros

El siguiente ejemplo añadió confusión en mi comprensión. No puedo entender cómo es posible modificar la variable const local. Por favor, ayúdame a entender lo mismo.

/* Compile code without optimization option */ // volatile.c #include  int main(void) { const int local = 10; int *ptr = (int*) &local; printf("Initial value of local : %d \n", local); *ptr = 100; printf("Modified value of local: %d \n", local); return 0; } 

$ gcc volátil.c -o volátil -save-temps

$ ./volatile

Valor inicial de local: 10

Valor modificado de local: 100

Esto es simplemente un comportamiento indefinido si miramos el borrador del estándar C99, sección 6.7.3 Calificadores de tipo, párrafo 4 , dice:

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. Si se intenta hacer referencia a un objeto definido con un tipo calificado volátil mediante el uso de un valor l con un tipo no volátil, el comportamiento no está definido. 115)

Entonces no puedes tener expectativas sobre los resultados y no deberías estar haciendo esto.

Si miramos el párrafo 2 dice:

Las propiedades asociadas con tipos calificados son significativas solo para expresiones que son lvalues. 114)

y la nota al pie 114 dice:

La implementación puede colocar un objeto const que no sea volátil en una región de almacenamiento de solo lectura. Además, la implementación no necesita asignar almacenamiento para tal objeto si su dirección nunca se usa.

En general, la implementación no tiene por qué hacer que las variables const sean de solo lectura, pero puede ser que como R … señale que colocar una variable automática en la memoria de solo lectura sería difícil.

Es posible porque ptr apunta a un int , no a un const int , por lo tanto, puede escribir en la dirección de memoria contenida en ptr . No hay nada más que eso, realmente.

const realidad no marca una ubicación de memoria como de solo lectura; si realmente es de solo lectura o no, no está realmente definido por el estándar de idioma. Por lo general, no lo es (como usted ya descubrió). Pero aún así, no se debe escribir.