C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释

前言:


在学习黑马教学const修饰指针的时候,碰到一个问题如下 在.cpp文件下编译时出现报错,.c文件下不报错 。这种能骗过编译器的写法不提倡。在严格的编译器上都是UB(undefined behavior )行为无法通过编译。


1. .cpp文件:

在这里插入图片描述
问题分析:类型不对 要改成int*p=(int*)&a,而且用指针去访问一个不对的东西,访问就是读写,是一个未定义行为。

改成int*p=(int*)&a 但是结果却是a=10,*p=100;我们是需要a=*p=100。
为了改善这种状况,我们可以在定义a时再加一个volatile修饰,避免编译器优化:在这里插入图片描述


2. .c文件:
在这里插入图片描述
**问题分析:**直接这样写在.c文件下不报错,是因为visual studio做了优化,这是在混过编译器,不可取,所以以后const修饰,还是同意写成以下格式

volatile const int a = 10;
	int* p = (int*)&a;
	*p = 100;

visual studio有自动优化效果所以在.c文件下能实现这种功能,下面是我用特制开了严格模式的dev c++ 出现的情况
在这里插入图片描述可以看出其实这种写法是不可取的,不能因为能蒙混过部分编译器而去使用这种写法!!!

发布了28 篇原创文章 · 获赞 7 · 访问量 1191

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/105074775