C语言中const只读变量及常量的注意事项

50 篇文章 2 订阅
  • C语言中存在const修饰的变量,一般我们会直接称作“常量”,但是其实更准确的称为只读变量。位置:内存堆栈。只读的性质由编译器赋予,人为修改编译不过。
    只读变量需要初始化,不然编译报错,因为定义性声明时如果不初始化,之后不允许初始化,这个变量就没有意义了。
  • 其实在C语言中存在真正的常量,如:char *p = “Hello World”,”Hello World”就是真正的常量。位置:内存的常量存储区(内存中真正的只读区域)。只读的性质由操作系统赋予,所以人为修改编译通过,但是运行崩溃。
  • 这篇写得比较简单,如果想深究,请看:http://blog.csdn.net/csdn_lsd/article/details/78420320

参考:https://jingyan.baidu.com/article/59a015e3522575f7948865c1.html

只读变量

  • 虽然变量由const修饰,但是从本质上仍然是变量,所以存储在堆栈和静态存储区,这些区域从进程角度讲是可读可写的,但是为什么const修饰后就不可写了。
  • 原因:
    C语言编译主要分为编译和链接两个部分,如果人为修改只读变量,在编译器编译阶段(第二步:编译过程,做语法检查,生成汇编)检查语法错误的时候将报错,这就是C语言规定的语法,而不是const修饰的内存空间的属性变成了只读,所以我们当然可以修改这个空间的值了,只不过我们需要获取这个空间的地址,指针
#include <stdio.h>
int main(void)
{
    const int i = 100;
    //int *p = &i;
    //warning:initialization discards ‘const’ qualifier from pointer target type
    //初始化从指针目标类型中丢弃'const'限定符
    int *p = (int *)&i;//&i是(const int *),强转为(int *),不会警告
    *p = 200;
    printf("now the value of i is %d\n",i);
    return 0;
}

输出:
windows:the value of i is 100
ubuntu:the value of i is 200

常量

#include <stdio.h>
int main(void)
{
    char *p = "hello world";
    *p = 'w';//编译通过,不报warning
    return 0;
}
  • 这段代码可以通过编译的第二步:编译过程,生成汇编代码,但是运行时程序崩溃。常量放在内存中的静态区的常量区,这块空间由系统管理,编译器无权管理,所以编译时不报警告,运行时崩溃。
总结

  • const变量和常量从本质上来说是不一样的,他们在进程中所处的区域,及他们的属性的控制都是不同的。所以对它们进行操作的错误也是不同,即管理它们的对象不同,只读变量由编译器约束和常量由操作系统去约束。
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值