龙空技术网

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

我不是你的狗 129

前言:

眼前小伙伴们对“可以修饰局部变量”都比较讲究,小伙伴们都需要了解一些“可以修饰局部变量”的相关文章。那么小编同时在网络上收集了一些对于“可以修饰局部变量””的相关知识,希望小伙伴们能喜欢,你们快快来学习一下吧!

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

#include <stdio.h>

const int v1=1;

int main(){

int *p2v1=&v1;

*p2v1=2;

return 0;

}

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

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

Disassembly of section .rodata:

0000000000400580 <_IO_stdin_used>:

400580: 01 00 add %eax,(%rax)

400582: 02 00 add (%rax),%al

0000000000400584 <v1>:

400584: 01 00 add %eax,(%rax)

...

我们发现v1变量处于只读内存数据段,我们的程序去修改只读内存,肯定就crash了。

我们再看const修饰局部变量的demo,由于局部变量存储于栈中,我们是完全可以去修改它的。代码及运算结果如下:

#include <stdio.h>

int main(){

const int v1=1;

int *p2v1=&v1;

*p2v1=2;

return 0;

}

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

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

#include <stdio.h>

int main(){

const int v1=1;

int *p2v1=(int *)&v1;

*p2v1=2;

return 0;

}

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

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

标签: #可以修饰局部变量 #可以修饰局部变量的方法 #可以修饰局部变量的方法有哪些 #可以修饰局部变量的方法有