Изменил константу в с

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

Почему это происходит?

кажется, что я успешно изменил константу в C

под изменением я имею в виду, что я изменил биты в диапазоне адресов констант

поскольку «сложное (не совсем) выражение единства / идентичности» меняет ценность после коррупции.

но Z остается тем же. Зачем?

почему одни и те же адреса имеют разные значения при разыменовании. ?

PS: вы можете использовать любое выражение личности

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

[редактировать]

хорошо, позвольте мне перефразировать это:

z = 420

&z = 1310548

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

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

Теперь я делаю, чтобы испортить константу

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

СЕЙЧАС ПОСЛЕ ПОВРЕЖДЕНИЯ:

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

&z = 1310548

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

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

ЗАЧЕМ?

Ответы на вопрос(3)

Ваш ответ на вопрос