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中修改了一個常數
似乎我已經成功地使用C
修飾的恆定通過修改我的意思是我在常數發生變化的位地址範圍
爲「複合物(不是真的)統一/標識表達」 腐敗後更改值。
但是z保持不變。爲什麼?
當解除引用時,同一個地址有多少個不同的值。 ?
PS:u可以使用任何身份表達
eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));
[編輯]
OK讓我重新措辭:有
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
爲什麼?
也許編譯器通過將'z'放入寄存器來優化。然後你做了一些瘋狂的事情來訪問'z'的內存並改變它,所以編譯器實際上讀取內存。沒有任何優化就嘗試它會很有趣。 – Starkey 2010-10-09 15:25:57
我不認爲C中的「const」意味着你認爲它的作用。 – 2010-10-09 15:27:00
這是一些真正混淆的代碼。 – 2010-10-09 15:29:37