运行以下程序后:
gcc -c volVars.c -o volv
./volv
它编译。</ p>
#include<stdio.h>
void main(){
printf("study of volatile pointers\n");
const int lConstInt=6;
printf("\n const int is %d\n",lConstInt);
volatile const int *lvcint=&lConstInt;
printf("volatile const int after assignment = %d\n",*lvcint);
//*lvcint=*lvcint+1; uncommenting this gives compilation error
int *track = lvcint;
*track = *track + 1;
printf("modified the lcoation = %d\n",*track);
}
如果我取消注释lvcint=*lvcint+1;
行,则会出现预期错误。但如果我使用非const的轨道引用该指针(lvcint
),我可以修改其内容。我在那条线上收到警告但最后我能够修改只读位置的内容。 gcc中是否有任何错误,或者我遗漏了一些错误。
答案 0 :(得分:0)
粗略地说,const
关键字(仅)是一种很好的做法,可以防止一些潜在的错误,也可以触发更好的编译优化。
但它实际上并没有像权限位那样保护变量。
有时编译器可能会将常量变量放在二进制文件的只读段中,写入它们会触发异常内存访问等异常,但您不能依赖它。
答案 1 :(得分:0)
这不是gcc中的错误,在这种情况下会发出警告,你应该时刻注意警告。
更改const
变量的值会生成未定义的行为,基于标准意味着您无法知道将会发生什么。在不同的机器,编译器,程序或系统的状态,月亮的阶段,它可能表现完全不同。
通常由开发人员来避免未定义的行为,编译器无法找出所有可能的情况并发出错误。
答案 2 :(得分:0)
在Linux下,我收到以下警告:
警告:初始化会丢弃'const volatile'限定符 指针目标类型[默认启用]
我认为这意味着编译器实际上删除了const限定符并正常初始化它们。我不能肯定地说,但这是我最好的猜测,因为这段代码拒绝在Windows下的GCC中编译。我在Windows中收到以下错误:
“错误:从'const volatile int *'无效转换为'int *'
所以是的,我不得不猜测编译器修改了代码。
至于为什么你注释掉的这一行会导致错误,这是因为你无法修改常量(你应该不能这样做)。
资料来源:我自己的实验。