欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-04 18:21:22
...

前言:


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


1. .cpp文件:

C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释
问题分析:类型不对 要改成int*p=(int*)&a,而且用指针去访问一个不对的东西,访问就是读写,是一个未定义行为。

改成int*p=(int*)&a 但是结果却是a=10,*p=100;我们是需要a=*p=100。
为了改善这种状况,我们可以在定义a时再加一个volatile修饰,避免编译器优化:C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释


2. .c文件:
C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释
**问题分析:**直接这样写在.c文件下不报错,是因为visual studio做了优化,这是在混过编译器,不可取,所以以后const修饰,还是同意写成以下格式

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

visual studio有自动优化效果所以在.c文件下能实现这种功能,下面是我用特制开了严格模式的dev c++ 出现的情况
C语言:const修饰的常量,不能被直接修改 ,但是可以通过指针进行间接修改所出现的一些问题解释可以看出其实这种写法是不可取的,不能因为能蒙混过部分编译器而去使用这种写法!!!

相关标签: c语言 编译器