1.const定义的局部变量
2.const定义的全局变量
const是 c语言中的常量修饰符。实际上const 定义的变量是可以被修改的,准确来说是其定义变量的内存值可以被修改。
1.修改局部const:
#include<stdio.h>
int main(){
// 全局const 存于 只读数据段中 ,局部const 变量存于堆栈。
const int a=10;
int *b=(int *)&a;
*b=20;
printf("%d %d",*b,a);
//从堆栈中直接读取
printf("\n%d",*(int *)&a); //内存中的值被修改了
}
// 全局const 存于 只读数据段中 ,局部const 变量存于堆栈。
const int a=10;
int *b=(int *)&a;
*b=20;
printf("%d %d",*b,a);
//从堆栈中直接读取
printf("\n%d",*(int *)&a); //内存中的值被修改了
}
结果如下:
虽然内存中的值被修改了,但是直接读取a的值来自堆栈,所以修改前的数据10。
2.修改const定义的全局变量时:
#include<stdio.h>
const int a=10;
int main(){
// 全局const 存于 只读数据段中 ,局部const 变量存于堆栈。
int *b=(int *)&a;
*b=20;
printf("%d %d",*b,a);
//从堆栈中直接读取
printf("\n%d",*(int *)&a); //内存中的值被修改了
}
// 全局const 存于 只读数据段中 ,局部const 变量存于堆栈。
int *b=(int *)&a;
*b=20;
printf("%d %d",*b,a);
//从堆栈中直接读取
printf("\n%d",*(int *)&a); //内存中的值被修改了
}
结果如下(程序直接停止运行):
因为const定义的全局变量存储在只读数据中,所以按地址修改会导致程序出错。
笔者自认才疏学浅,仅略知皮毛,文中错谬之处在所难免,若蒙诸君不吝告知,将不胜感激。