const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变
来源:互联网 发布:淘宝代缴公积金靠谱么 编辑:程序博客网 时间:2024/05/10 21:27
很多人面试的时候都会被问这段代码最后a和*p分别是多少。答案不过三种:要么程序报错,要么a=10,*p=100,要么a=100,*p=100;
其实这个地方是分const变量是全局还是局部的情况,先看局部情况:这份代码保存为main.c,先用gcc编译,结果如下:
可以看到程序崩溃了,那么g++呢?
其实这个地方是分const变量是全局还是局部的情况,先看局部情况:这份代码保存为main.c,先用gcc编译,结果如下:
注意结果,a和*p都是100,说明a的值是可以被修改的。但是先不要着急,再看看g++的结果。
结果让人大吃一惊,居然和gcc输出不一样,为什么呢?我只能说和编译器有关,仅此而已,那么有没有在g++下出现两个100呢,答案是在const前加上volatile。
好,const是局部变量就讨论到这儿,再看看const是全局变量的情况:
可以看到程序崩溃了,那么g++呢?
同样程序崩溃!
我们暂且把局部变量时gcc和g++的输出不同归结为编译器的原因,那么为什么全局变量会引起程序崩溃?
大神的解答是这样的:“那是因为常量在的那个内存页设了只读属性,要是你用函数把那页改成可写的就不会死了。全局const是放到了只读的text段。全局静态存储区 页面属性只读”
好了,就到这儿吧,但愿面试官这道这些,不然只要我们回答的和他的不相符,他就认为我们是错误的。
0 0
- const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变
- int *p=(int *)a;
- int *p=&a
- int *p=(int *)(&a + 1)的理解
- int & *p; //不能建立指向引用的指针;int *a; int * & p=a; //正确,指针变量的引用
- int & *p; //不能建立指向引用的指针;int *a; int * & p=a; //正确,指针变量的引用
- int a[5]={0}; int *p=a; p-a=1;
- 已知int a[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int **q=p;表达式*(p[0]+1)+**(q+2)的值是____。
- 关于指针int *p=&a和*p=&a的纠正
- const int **pp = &p;
- int a 和int*a = new int 的区别
- int *ptr2=(int *)((int)a+1);
- int a = (int)(((int*)0)+4);
- int *p=new int; int *p=new int[10]; int *p=new int(10);这三个有什么区别
- const int a; int const a; const int *a; int * const a; int const * a const; 之间的区别?
- const int a; int const a; const int *a; int * const a; int const * a const; 之间的区别
- c++中int a[10]和int a=new int[10]]有什么区别
- const int a; int const a; const int *a; int * const a; const int * const a;
- 自定义进度条方式
- jquery validate使用攻略 第四步
- Codeforces Round #341 (Div. 2)-A. Wet Shark and Odd and Even(奇数+奇数为偶数)
- 11.数据类型
- [读书笔记]线程的认识
- const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变
- iOS9全新的联系人相关框架——Contacts Framework
- Oracle 基于Windows访问带端口的远程服务器
- Android中自定义属性Attr的详解使用.
- uva1363
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
- 自动平滑轮播、左右循环view
- Linux共享内存使用常见陷阱与分析
- mac无法充电解决方法