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分区,任何时候都是只读变量。