在C语言中,使用const关键字修饰的变量代表着其不能被改变,是一个常量,那么在C语言中,其实并没有对于其做到一个很好的保护,使用const变量修饰的变量虽然不能通过直接的赋值操作去改变这块内存的值,如果这样做,编译环境会报错提示不能这样做,不能改变一个常量的值,从而使得编译不通过,但是,我们仍然有办法去改变其值,比如指针越界的方法,通过这个方法,我们可以骗过编译器“间接”修改用const关键字修饰的变量存储区域存储的值,代码如下:
#include <stdio.h>
int main()
{
const int a = 0x12345678;
int b = 0x11223344;
//a = 100;
int *p = &b;
int *q = &a;
q[0]= 0x100;
printf("the a is %x\n",a);
printf("the b is %x\n",q[-1]);
printf("the a is saved in %x\n",q);
printf("the b is saved in %x\n",p);
return 0;
}
在使用了const变量修饰了变量a后,我们不能通过例如a = 100;这样的显式语句来修改其值,在GCC环境下编译会报如下错误:
C:\Users\11197\Desktop\main>gcc -o main main.c
main.c: In function 'main':
main.c:6:4: error: assignment of read-only variable 'a'
a = 100;
编译环境告诉我们这个变量所代表的存储区域是只读的,但是我们可以取变量b的存储区域赋值给指针变量p,通过 q[0]= 0x100;改变其存储的值,而且在编译中还发现,先声明的变量a,居然存储在较高的存储空间,后声明的变量b,存储在较低的位置,运行结果如下:
C:\Users\11197\Desktop\main>main
the a is 100
the b is 11223344
the a is saved in 62fe0c
the b is saved in 62fe08
按理说,局部变量存储在栈空间,先编译的是a变量,应该是处于相较于b更低的位置,但是运行出来的结果显示a存储的地址为62fe0c,而b存储的地址为60fe08,难道栈空间的底部为高地址,向上为低地址咩?