C 常量
c 常量的两种实现方法:
define
宏const
关键字
const
关键字
- 常量
const int a
/int const a
a 是一个 int 类型常量 - 常量指针
const int *a
/int const *a
a 是一个指针,指向一个 int 类型常量 - 指针常量
int *const a
a 是一个指针常量(指针类型(int *)的常量), 指向的位置不能修改 - 指向常量的指针常量
const int *const a
同上,不过更进一步,指向位置是一个常量(const int),不能更改
问题
int main()
{
const int a = 1;
int *ptr = (int *)&a;
*ptr = 2;
printf("a = %d\n", a);
return 0;
}
如果用 gcc 编译会输出:a = 2
, g++ 的话,会输出 a = 1
, WHY? 为什么 C 允许修改常量,是不是一个 BUG?
原因
参考网上诸多资料,我的理解如下:
- C 会给 const 常量正常分配内存,const 只会在编译时起到静态分析的作用(限定常量不能作为左值)。
- C++ 则是将 const 常量放在符号表,如果用指针指向这个常量,会新分配内存地址,操作也是操作的这个内存空间,符号表中存储的值不受影响。
- 符号表在内存布局中的那一部分?
参考资料与拓展阅读
- 菜鸟教程, C 常量
- 知乎专栏, 技术让梦想更伟大, C语言中const的用法详解
- 博客园, C++笔记017:C语言中 “冒牌货”const和const符号表
- 知乎, C语言函数中用const 定义的常量是存放在内存的静态存储区的吗?