能够改变const指针中的值

时间:2013-03-31 09:05:58

标签: c pointers gcc

运行以下程序后:

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中是否有任何错误,或者我遗漏了一些错误。

3 个答案:

答案 0 :(得分:0)

粗略地说,const关键字(仅)是一种很好的做法,可以防止一些潜在的错误,也可以触发更好的编译优化。

但它实际上并没有像权限位那样保护变量。

有时编译器可能会将常量变量放在二进制文件的只读段中,写入它们会触发异常内存访问等异常,但您不能依赖它。

答案 1 :(得分:0)

这不是gcc中的错误,在这种情况下会发出警告,你应该时刻注意警告。

更改const变量的值会生成未定义的行为,基于标准意味着您无法知道将会发生什么。在不同的机器,编译器,程序或系统的状态,月亮的阶段,它可能表现完全不同。 通常由开发人员来避免未定义的行为,编译器无法找出所有可能的情况并发出错误。

答案 2 :(得分:0)

在Linux下,我收到以下警告:

  

警告:初始化会丢弃'const volatile'限定符   指针目标类型[默认启用]

我认为这意味着编译器实际上删除了const限定符并正常初始化它们。我不能肯定地说,但这是我最好的猜测,因为这段代码拒绝在Windows下的GCC中编译。我在Windows中收到以下错误:

  

“错误:从'const volatile int *'无效转换为'int *'

所以是的,我不得不猜测编译器修改了代码。

至于为什么你注释掉的这一行会导致错误,这是因为你无法修改常量(你应该不能这样做)。

资料来源:我自己的实验。