bak*_*kra -1 c pointers constants
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
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
似乎我已成功修改了C中的常量
通过修改我的意思是我已经改变了常量地址范围中的位
因为"复杂(不是真的)统一/身份表达"在腐败后改变了价值.
但是z保持不变.为什么?
在解引用时,同一地址如何具有不同的值.?
PS:你可以使用任何身份表达
eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));
Run Code Online (Sandbox Code Playgroud)
[编辑]
好吧让我重新说一下:
z = 420
&z = 1310548
*(&(*(&z+1))-1) = 420
(&(*(&z+1))-1) = 1310548
Run Code Online (Sandbox Code Playgroud)
现在我做腐败常数
*((char *)&z+1) = 21;
Run Code Online (Sandbox Code Playgroud)
现在腐败之后:
z = 420 // NO CHANGE EVEN THOUGH I have corrupted
&z = 1310548
*(&(*(&z+1))-1) = z = 5540 // THE CHANGE
(&(*(&z+1))-1) = &z = 1310548
Run Code Online (Sandbox Code Playgroud)
为什么?
你所拥有int const的实际上不是一个常数而是一个const合格的对象.因此,如果您通过指针操作来玩游戏来更改此对象,则这可能是可能的,但会提供未定义的行为.
C中唯一的整数常量是数字标记,整数字符常量,例如'a'和enum常量.
这里有一点神秘之处.通过使用强制转换来告诉编译器您正在更改的内容const不合格,您将导致未定义的行为:
6.7.3/5"类型限定词"(C99):
如果尝试通过使用具有非const限定类型的左值来修改使用const-quali fi ed类型定义的对象,则行为是未定义的.
某些实现可能已将变量z放在只读内存中,并且您要么没有明显的更改或某种访问冲突.
在任何情况下,未定义的行为意味着所有赌注都已关闭 - 在您的情况下,您可以看到const值的明显修改.