Confusione relativa alla modifica della variabile const mediante puntatori

L’esempio seguente ha aggiunto confusione nella mia comprensione. Non riesco a capire come sia ansible modificare la variabile const locale. Per favore aiutami a capire lo stesso.

/* 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 volatile.c -o volatile -save-temps

$ ./volatile

Valore iniziale del locale: 10

Valore modificato del locale: 100

Questo è semplicemente un comportamento indefinito se guardiamo la sezione standard del draft C99 6.7.3 Qualificatori di tipo paragrafo 4 dice:

Se viene effettuato un tentativo di modificare un object definito con un tipo qualificato const tramite l’utilizzo di un valore lvalue con tipo non const-qualificato, il comportamento non è definito. Se si tenta di fare riferimento a un object definito con un tipo con qualifica volatile tramite l’uso di un lvalue con tipo non volatile, il comportamento non è definito. 115)

Quindi non puoi avere aspettative sui risultati e non dovresti farlo.

Se guardiamo il paragrafo 2 , dice:

Le proprietà associate ai tipi qualificati sono significative solo per le espressioni che sono lvalue. 114)

e la nota 114 dice:

L’implementazione può posizionare un object const che non è volatile in una regione di archiviazione di sola lettura. Inoltre, l’implementazione non deve allocare spazio per tale object se il suo indirizzo non viene mai utilizzato.

In generale, l’implementazione non deve rendere le variabili const di sola lettura, ma può anche, ma come R .. sottolinea che posizionare una variabile automatica nella memoria di sola lettura sarebbe difficile.

È ansible perché ptr punta a un int , non a un const int , quindi, puoi scrivere sull’indirizzo di memoria contenuto in ptr . Non c’è nient’altro di quello, davvero.

const non contrassegna in realtà una locazione di memoria come di sola lettura; se sia veramente di sola lettura o meno non è realmente definito dallo standard del linguaggio. Di solito non lo è (come l’hai scoperto). Ma comunque, non è necessario scriverci.