const类型重新赋值,编译通过,结果出乎意料,大家帮忙看看

黑呼乎 2010-08-26 10:46:37
看下边这段程序,主要是验证const类型变量通过指针能否再次被赋值。
g++编译是失败的,gcc编译通过,但给出了一个警告:
warning: initialization discards qualifiers from pointer target type

运行后输出的结果是:打印的四个地址都是一样的,但ci仍等于30,而*q却等于10,这到底是为什么?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
const int ci = 30;
int *p = &ci;
*p = 10;

printf("&ci = 0x%x;\n", &ci);
printf("p = 0x%x;\n", p);

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

printf("&ci = 0x%x;\n", &ci);
printf("p = 0x%x;\n", p);

exit(0);
}
...全文
127 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑呼乎 2010-08-26
  • 打赏
  • 举报
回复
多谢!看了之后明白了,自己解释一下

在&ci;之前ci并没有分配内存,而是将其值放入了常量表中,并建立了对应关系,以后用到ci的时候直接去常量表中查询。运行到此处后,不得不给ci分配内存,并让p指向了ci,*p=10也确实把10放入了给ci分配的内存中,但用到ci的时候还是去常量表中查询,而不是根据其地址获取,所以其值仍为30.因此有了上边看似诡异的结果。
brookmill 2010-08-26
  • 打赏
  • 举报
回复
printf("ci = %d;\n", ci); 这里编译器作了优化,他并没有从哪个地址读取ci的值,而是把ci换成了30。
既然代码说ci是const,编译器就相信了。
就是所谓“常量折叠”,楼主可以自己google一下看看

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧