C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释
程序员文章站
2022-03-04 18:21:22
...
前言:
在学习黑马教学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++ 出现的情况:
可以看出其实这种写法是不可取的,不能因为能蒙混过部分编译器而去使用这种写法!!!
上一篇: opengl虚拟校园漫游
下一篇: 一颗简单的hibernate栗子