废话不多说,先看const修饰全局变量的情况,代码及运行情况如下:
#include
const int v1=1;
int main(){
int *p2v1=&v1;
*p2v1=2;
return 0;
}
我们对程序进行反汇编分析,汇编代码如下:
Disassembly of section .rodata:
0000000000400580 <_io_stdin_used>:
400580: 01 00 add %eax,(%rax)
400582: 02 00 add (%rax),%al
0000000000400584 :
400584: 01 00 add %eax,(%rax)
...
我们发现v1变量处于只读内存数据段,我们的程序去修改只读内存,肯定就crash了。
我们再看const修饰局部变量的demo,由于局部变量存储于栈中,我们是完全可以去修改它的。代码及运算结果如下:
#include
int main(){
const int v1=1;
int *p2v1=&v1;
*p2v1=2;
return 0;
}
那么c++中也要修改v1局部变量要如何操作呢,不卖关子了,代码如下
#include
int main(){
const int v1=1;
int *p2v1=(int *)&v1;
*p2v1=2;
return 0;
}
(友情提示c++中const局部变量很诡异,具体见我的另一篇文章c++揭秘,诡异的const局部变量)