深度剖析:具名常量

Google 网上论坛

内容来自——DS计划C深入学习项目

     欢迎加入,共同进步

访问此论坛

c中所谓的具名常量,是指用const修饰的变量。

本文会深入一下具名常量的本质,存储位置,以及是否可以更改,如何更改等。

首先,声明一下我测试的环境:linux企业版5.0。

 

测试非static全局变量

测试程序如下:

编译,然后使用命令“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局部变量
存储位置文本段文本段堆栈段文本段
通过变量名更改其值
通过指针更改其值


 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值