Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44306
  • 博文数量: 21
  • 博客积分: 80
  • 博客等级: 民兵
  • 技术积分: 92
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-23 14:52
文章分类
文章存档

2013年(7)

2012年(14)

我的朋友

分类: C/C++

2012-11-23 22:11:16

原文地址程序笔试题-const变量通过指针修改问题 作者long_yii

以下内容部分内容对原文进行了修改

const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
以下是VC6下才测试。
1 不能修改的情况
#include
int const a = 10;
void main(void)
{
int *p = (int*)&a;
*p = 20;
printf("%d\n", *p);
}
程序编译通过,但运行时错误:
指示a存储的空间不可以写,原因为const变量存储在常量区,其值不可修改,只有可读属性。
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在预处理时将该变量优化,使程序在运行过程中只从内存读一次值.加上volatile属性可使编译器对该变量不进行优化,从而可使程序运行时从内存中重新取值,输出正确的变量值

阅读(894) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux驱动程序开发的学习步骤

给主人留下些什么吧!~~