打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
深度剖析:具名常量
userphoto

2017.11.23

关注
内容来自——DS计划C深入学习项目
欢迎加入,共同进步
访问此论坛
c中所谓的具名常量,是指用const修饰的变量。
本文会深入一下具名常量的本质,存储位置,以及是否可以更改,如何更改等。
首先,声明一下我测试的环境:linux企业版5.0。
测试非static全局变量
测试程序如下:
[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int g_int_a = 1000;
int main()
{
printf("g_int_a is %d./n", g_int_a);
printf("g_int_a is %d./n", g_int_a);
return 0;
}
编译,然后使用命令“size 可执行程序名”查看其段大小。
[root@ss test]# size test
text    data     bss     dec     hex filename
1229     280       8    1517     5ed test
之后,将全局变量g_int_a更改为非const,编译,在使用size命令查看:
[root@ss test]# size test
text    data     bss     dec     hex filename
1225     284       8    1517     5ed test
可以发现,test段(文本段)的大小少了四个字节,而data段(数据段)的大小增大了4个字节。
结论1:const修饰的全局变量,保存在文本段中。
之后,测试一下具名常量是否可以更改。依然是上面的代码,在main中增加语句:
g_int_a = 10;
编译,发现有错误提示:“main.c:11: 错误:向只读变量 ‘g_int_a’ 赋值”
结论2:const修饰的全局变量,无法通过变量名更改其值。
测试一下是否可以通过地址来更改他的值。在main中增加语句
int* pint = (int *)&g_int_a;
*pint = 10;
编译,发现没有错误。然后运行,系统提示段错误,程序退出:”段错误 (core dumped)“
结论3:const修饰的全局变量由于保存在文本段中,所以它的值不可以通过指针的方式修改。
测试static全局变量
和非static全局变量一致,符合上面的三个结论。
测试static局部变量
和非static全局变量一致,符合上面的三个结论。
测试非static局部变量
结论1:const修饰的局部变量,保存在堆栈段中。
结论2:const修饰的局部变量,无法通过变量名更改其值。
结论3:const修饰的局部变量,它的值不可以通过指针的方式修改。
综上:
非static全局变量static全局变量非static局部变量static局部变量
存储位置文本段文本段堆栈段文本段
通过变量名更改其值否否否否
通过指针更改其值否否是否
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
嵌入式编程中关于const,static,extern,volatile的用法
C语言中的const
【那些人追的干货】如何正确使用const,static,extern
作用域 全局变量 局部变量 静态变量 外部变量 常量 volatile变量_notepad...
50-100
学习单片机C语言,必知的数据存储与程序编写知识!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服