const变量通过指针修改问题
2015-08-13 14:51
309 查看
const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
以下是VC6下才测试。
1. 不能修改的情况
程序编译通过,但运行时错误:
指示a存储的空间不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性。
2. 能修改的情况
程序能正常运行,且常量被修改了,但是有一个问题:
为什么 printf(" a=%d\n", a);
打印a=10?
难道一个地址空间可以存储不同的俩个值,当然不能,哈哈,这是因为a是const变量,编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10。a实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在堆栈中。
验证如下:
变量a和b的地址相近。
总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
const局部变量存储在堆栈中,可通过指针修改其值;
const变量在预处理是处理,编译器只对其值读取一次。
以下是VC6下才测试。
1. 不能修改的情况
#include int const a = 10; void main(void) { int *p = (int*)&a; *p = 20; printf("%d\n", *p); }
程序编译通过,但运行时错误:
指示a存储的空间不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性。
2. 能修改的情况
#include void main(void) { int const a = 10; int *p = (int*)&a; *p = 20; printf("&a=%d\n", &a); printf(" p=%d\n", p); printf(" a=%d\n", a); printf("*p=%d\n", *p); }
程序能正常运行,且常量被修改了,但是有一个问题:
为什么 printf(" a=%d\n", a);
打印a=10?
难道一个地址空间可以存储不同的俩个值,当然不能,哈哈,这是因为a是const变量,编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10。a实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在堆栈中。
验证如下:
#include void main(void) { int const a = 10; int b = 20; int *p = (int*)&a; *p = 20; printf("&a=%x\n", &a); printf("&b=%x\n", &b); printf(" p=%x\n", p); printf(" a=%d\n", a); printf("*p=%d\n", *p); }
变量a和b的地址相近。
总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
const局部变量存储在堆栈中,可通过指针修改其值;
const变量在预处理是处理,编译器只对其值读取一次。
相关文章推荐
- 了解 Spring Data JPA
- 【ssh2学习记录】3、关于ssh2框架整合以及hibernate的一些总结
- Hibernate Criteria的详细用法
- 块级作用域
- I2C通信 EEPROM之写与读
- Android 4.0以上简单实现倒计时按钮
- 由浅入深理解IOC
- 通用css样式模板,
- 深入理解SELinux SEAndroid(结局)
- 【NOI2015】【BZOJ4196】软件包管理器
- 【system】 linux 服务器之间拷贝文件
- 羊年计划(二)
- SQL 对时间的处理
- LC.exe -1
- 解决adb无法识别
- POJ---1159-Palindrome(01DP)
- poj-1458-Common Subsequence(LCS)
- 使用 libevent 和 libev 提高网络应用性能
- 人件札记:开放式的办公室环境
- [转] js 实现table每列可左右拖动改变列宽度