Se modificó una constante en c

const int z = 420;

printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
// O/P:420 | 420

printf("\n%u | %u",&z,(&(*(&z+1))-1) );             //address
// O/P:1310548  | 1310548

*((char *)&z+1) = 21;       //I change value for the 1st-Bit
                                    //corrupting constant

 printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
//the complex(not really) expression evaluates to z
// O/P:420| 5540

printf("\n%u | %u",&z ,(&(*(&z+1))-1) );                
//the complex(not really) expression evaluates to &z
// O/P:1310548 | 1310548

¿Por qué está pasando esto?

parece que he modificado con éxito la constante en C

por modificar quiero decir que he cambiado los bits en el rango de direcciones constantes

como la "compleja (no realmente) expresión de unidad / identidad" cambia de valor después de la corrupción.

pero la z sigue siendo la misma. ¿Por qué?

¿Cómo es que la misma dirección tiene valores diferentes cuando se des referencia? ?

PD: puedes usar cualquier expresión de identidad

eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));

[editar]

ok déjame reformularlo:

z = 420

&z = 1310548

*(&(*(&z+1))-1) = 420

(&(*(&z+1))-1)  = 1310548

ahora lo hago para corromper la constante

*((char *)&z+1) = 21;

AHORA DESPUÉS DE LA CORRUPCIÓN:

z = 420     // NO CHANGE EVEN THOUGH I have corrupted

&z = 1310548

*(&(*(&z+1))-1) = z = 5540    // THE CHANGE

(&(*(&z+1))-1)  = &z = 1310548

¿POR QUÉ?

Respuestas a la pregunta(3)

Su respuesta a la pregunta