最近在看一些有关const的知识点时,发现一个有趣的事情,据说通过这段代码就可以修改常量的值:
const int a = 10;
int *p = (int*)&a;
*p = 20;
cout << *p << endl;
我在visual c++中调试了一下,a的值没有变,在百度中看到一个大神的回答很是犀利,收藏让大家看看!
void main()
{
const int a=3;
int *p;
p=(int *)&a;
*p=5;
printf("%d",a);
printf("%d",*p);
}
这个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);
其中包含汇编语言,不会的赶紧去补充知识哦!!