c++ 全局变量_c/c++面试,const修饰全局变量与局部变量的区别,新手必看

废话不多说,先看const修饰全局变量的情况,代码及运行情况如下:

#include

const int v1=1;

int main(){

int *p2v1=&v1;

*p2v1=2;

return 0;

}

23fc2aee4b6d17ca0eba75ea8b5e7bfb.png

上面的demo运行后,发现程序直接crash,因为访问了非法内存

我们对程序进行反汇编分析,汇编代码如下:

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;

}

9b7be29bb9a1f2694bc9bf1e0d11480e.png

c语言中,这代码除了在编译阶段有警告之外,没有任何问题。而c++中编译器会报错

那么c++中也要修改v1局部变量要如何操作呢,不卖关子了,代码如下

#include

int main(){

const int v1=1;

int *p2v1=(int *)&v1;

*p2v1=2;

return 0;

}

7801a15bbf9a7b1de92d8190e770922c.png

进行强转后,c++编译跟运行都没有问题了

(友情提示c++中const局部变量很诡异,具体见我的另一篇文章c++揭秘,诡异的const局部变量)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值