关于C语言对const类型修饰变量的说明以及变量存储方式的疑问

在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,难道栈空间的底部为高地址,向上为低地址咩?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值