const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变
2016-02-01 10:37
369 查看
[cpp] view
plaincopy
const int a = 10;
int *p = (int *)&a;
*p = 100;
很多人面试的时候都会被问这段代码最后a和*p分别是多少。答案不过三种:要么程序报错,要么a=10,*p=100,要么a=100,*p=100;
其实这个地方是分const变量是全局还是局部的情况,先看局部情况:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 100;
printf("%d\t%d\n", a, *p);
return 0;
}
这份代码保存为main.c,先用gcc编译,结果如下:
注意结果,a和*p都是100,说明a的值是可以被修改的。但是先不要着急,再看看g++的结果。
结果让人大吃一惊,居然和gcc输出不一样,为什么呢?我只能说和编译器有关,仅此而已,那么有没有在g++下出现两个100呢,答案是在const前加上volatile。
好,const是局部变量就讨论到这儿,再看看const是全局变量的情况:
[cpp] view
plaincopy
#include <stdio.h>
const int a = 10;
int main()
{
int *p = (int *)&a;
*p = 100;
printf("%d\t%d\n", a, *p);
return 0;
}
可以看到程序崩溃了,那么g++呢?
同样程序崩溃!
我们暂且把局部变量时gcc和g++的输出不同归结为编译器的原因,那么为什么全局变量会引起程序崩溃?
大神的解答是这样的:“那是因为常量在的那个内存页设了只读属性,要是你用函数把那页改成可写的就不会死了。全局const是放到了只读的text段。全局静态存储区 页面属性只读”
好了,就到这儿吧,但愿面试官这道这些,不然只要我们回答的和他的不相符,他就认为我们是错误的。
plaincopy
const int a = 10;
int *p = (int *)&a;
*p = 100;
很多人面试的时候都会被问这段代码最后a和*p分别是多少。答案不过三种:要么程序报错,要么a=10,*p=100,要么a=100,*p=100;
其实这个地方是分const变量是全局还是局部的情况,先看局部情况:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 100;
printf("%d\t%d\n", a, *p);
return 0;
}
这份代码保存为main.c,先用gcc编译,结果如下:
注意结果,a和*p都是100,说明a的值是可以被修改的。但是先不要着急,再看看g++的结果。
结果让人大吃一惊,居然和gcc输出不一样,为什么呢?我只能说和编译器有关,仅此而已,那么有没有在g++下出现两个100呢,答案是在const前加上volatile。
好,const是局部变量就讨论到这儿,再看看const是全局变量的情况:
[cpp] view
plaincopy
#include <stdio.h>
const int a = 10;
int main()
{
int *p = (int *)&a;
*p = 100;
printf("%d\t%d\n", a, *p);
return 0;
}
可以看到程序崩溃了,那么g++呢?
同样程序崩溃!
我们暂且把局部变量时gcc和g++的输出不同归结为编译器的原因,那么为什么全局变量会引起程序崩溃?
大神的解答是这样的:“那是因为常量在的那个内存页设了只读属性,要是你用函数把那页改成可写的就不会死了。全局const是放到了只读的text段。全局静态存储区 页面属性只读”
好了,就到这儿吧,但愿面试官这道这些,不然只要我们回答的和他的不相符,他就认为我们是错误的。
相关文章推荐
- 11.数据类型
- jquery validate使用攻略 第四步
- [读书笔记]线程的认识
- 工作一年又七个月,也谈谈工作,生活,人生
- android开发SDcard 响应的文件相关处理(一)
- No orientation specified, and the default is
- 自定义进度条方式
- 设置内核输出日志级别
- 基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
- 你真的了解break吗?
- Android——修改字符串中所有数字的样式
- iOS 引导页
- Android M新特性Doze and App Standby模式详解
- TCP初始化序列号ISN
- SSO
- CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)
- Oracle 额外增加表空间
- 接口测试
- Android中px dpi dip density densityDpi 的相关说明
- POST中文乱码解决方案