您的位置:首页 > 编程语言 > C语言/C++

【c/c++笔试题一】const变量通过指针修改问题

2014-03-18 14:12 369 查看
转载地址:http://blog.chinaunix.net/uid-26853826-id-3365403.html

const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改。
以下是VC6下才测试。
1 不能修改的情况
#include <stdio.h>

int const a = 10;

void main(void)

{

int *p = (int*)&a;

*p = 20;

printf("%d\n", *p);

}
程序编译通过,但运行时错误:



指示a存储的空间不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性。

2 能修改的情况
#include <stdio.h>

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 <stdio.h>

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变量在预处理是处理,编译器只对其值读取一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: