const变量是否可以修改值

const变量是否可以修改值

按直观理解,const关键字标识的变量,意味不能修改的变量,是常量,能不能修改呢?我们来做一些实验。

环境:选用 Ubuntu 平台,x86 gcc 工具。

局部变量的情况

本环境下的局部const变量存放于text段中,程序运行时会将此变量放置于栈区。

我们先直接对其进行修改。

int main()
{
    const int const_vol = 11;

    const_vol = 100;

    printf("const_vol = %d\n",const_vol);
    return 0;
}

编译这关都过不去。再试试下面这个间接的修改方法:

int main()
{
    const int const_vol = 11; 
    int *pointer = &const_vol;

    *pointer = 100;

    printf("const_vol = %d\n",const_vol);
    return 0;
}

编译器只进行了警告,我们的const变量也成功被改写了;

结论:对局部的const变量地址进行操作,完全可以重写const变量中的内容;

全局变量的情况

全局const变量是存放于rodata区的。

那能否进行修改呢?

const int global_const_vol = 10; 
char *s = "abcde";
int main()
{
    int *pointer = &global_const_vol;

    *pointer = 100;

    printf("global_const_vol = %d\n",global_const_vol);
    return 0;
}

编译只有warning,和局部的const变量一样

但执行就报段错误了,因为我们修改的是rodata段的变量。

总结

在gcc工具链中,局部const变量不能直接修改是由编译器控制的,其本身存放于代码运行时,临时分配的函数栈中。

而全局的const变量存放于rodata分区,任何时候都是只读变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值