定义了一个const型的常量,为什么能用指针修改它的值?

void main(){ const int a=3; int *p; p=(int *)&a; *p=5; printf("%d",a); printf("%d",*p);}
2025-04-29 11:08:20
推荐回答(3个)
回答1:

这个const a的值和它的地址没有丝毫关系,当出现a时,就会用3替换(就像宏一样),当以它的地址访问时(前提是编译器不会把它优化成a,比如*(&a)会优化成a),就会是地址单元的值

const int a=3;
011713CE mov dword ptr [a],3
int *p;
p=(int *)&a;
011713D5 lea eax,[a]
011713D8 mov dword ptr [p],eax
*p=5;
011713DB mov eax,dword ptr [p]
011713DE mov dword ptr [eax],5
printf("%d",a);
011713E4 mov esi,esp
011713E6 push 3 //看这里,直接取3,和a的地址没有丝毫关系
011713E8 push offset string "%d\n" (1175830h)
011713ED call dword ptr [__imp__printf (11782D4h)]
011713F3 add esp,8
011713F6 cmp esi,esp
011713F8 call @ILT+300(__RTC_CheckEsp) (1171131h)
printf("%d",*p);
011713FD mov esi,esp
011713FF mov eax,dword ptr [p]
01171402 mov ecx,dword ptr [eax]
01171404 push ecx
01171405 push offset string "%d\n" (1175830h)
0117140A call dword ptr [__imp__printf (11782D4h)]
01171410 add esp,8
01171413 cmp esi,esp
01171415 call @ILT+300(__RTC_CheckEsp) (1171131h)

你可以试试 printf("%d",*(((&a)+1)-1)); 和 printf("%d",*(&a));

也可以试试这样
int t=3;
const int a=t;
p=(int *)&a;
*p=5;
printf("%d",a);
printf("%d",*p);

你会发现a也变了,因为无法以一个立即数代替了

回答2:

我在linux下运行结果a的值已经改变了,跟*p的值一样,。应该是编译器的问题,编译的时候把代码优化了,运行前就把printf里的a替换成3了,所以运行时输出的是3,其实已经变成5了

回答3:

const指针所指向的内存单元为只读。