2

运行以下程序后:

gcc -c volVars.c -o volv

./volv

它编译。

#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;行,它会按预期给出错误。lvcint但是,如果我使用非常量的轨道引用该指针 ( ),我可以修改它的内容。我在该行收到警告,但最后我能够修改只读位置的内容。gcc 中是否有任何错误或者我缺少什么。

4

3 回答 3

0

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

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

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

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

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

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

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

于 2013-03-31T11:42:25.073 回答
0

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

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

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

于 2013-03-31T11:02:43.930 回答
0

这不是 gcc 中的错误,在这种情况下它确实会发出警告,您应该始终注意警告。

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

于 2013-03-31T11:03:26.623 回答