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

来源:互联网 发布:sql declare怎么运行 编辑:程序博客网 时间:2024/04/30 21:53
  • 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变量和常量从本质上来说是不一样的,他们在进程中所处的区域,及他们的属性的控制都是不同的。所以对它们进行操作的错误也是不同,即管理它们的对象不同,只读变量由编译器约束和常量由操作系统去约束。
原创粉丝点击