修改了c中的常量

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)

为什么?

msw*_*msw 6

恭喜,你骗了编译器而且它咬了你.

演员告诉编译器你有意违反规则并暗示你知道自己在做什么.当你这么做的时候,C很乐意让你在众所周知的脚下开枪.


Jen*_*edt 6

你所拥有int const的实际上不是一个常数而是一个const合格的对象.因此,如果您通过指针操作来玩游戏来更改此对象,则这可能是可能的,但会提供未定义的行为.

C中唯一的整数常量是数字标记,整数字符常量,例如'a'enum常量.


Mic*_*urr 5

这里有一点神秘之处.通过使用强制转换来告诉编译器您正在更改的内容const不合格,您将导致未定义的行为:

6.7.3/5"类型限定词"(C99):

如果尝试通过使用具有非const限定类型的左值来修改使用const-quali fi ed类型定义的对象,则行为是未定义的.

某些实现可能已将变量z放在只读内存中,并且您要么没有明显的更改或某种访问冲突.

在任何情况下,未定义的行为意味着所有赌注都已关闭 - 在您的情况下,您可以看到const值的明显修改.