Изменил константу в с
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
ЗАЧЕМ?