今天突发奇想,如果用一个指针指向const变量,再通过指针修改这个值会怎样?
实验1
const int a=1;
int *b = &a;
结果
test.c:20:14: error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]
实验2
#include<stdio.h>
void b(int *a)
{
*a=*a+1;
}
int main(void)
{
const int a=1;
int *c = (int *)(&a);
b(c);
printf("%d\t",a);
printf("%d\t",*c);
return 0;
}
输出 1 2
这个时候挺纳闷,怎么值不一样了,分身了?然后经高人指点继续实验
实验3
#include<stdio.h>
#include<string.h>
void b(int *a)
{
*a=*a+1;
}
int main(void)
{
volatile const int a=1;
int *c = (int *)(&a);
b(c);
printf("%d\t",a);
printf("%d\t",*c);
return 0;
}
实验结果 输出 2 2
第一次知道 常量值竟然能被改变 ???
然后网上找了找 有网友答复如下
Good question.
楼主给出的这种情况叫“未定义行为”,也就是说这种情况的处理不是由C标准制定的,随着具体环境的变化会有不同的、不可预料的后果。
你刚才给的应该是GCC的处理,我用OS X 10.11.1下的clang LLVM和Windows 10下的Visual Studio 2015测试的结果是这样的:
对于clang LLVM,执行时不更改const int intVar的值。
对于MSVC,执行时更改const int intVar的值。
简单地说这是一个未定义行为,编译器理应报告用户。但是如果编译器选择只报warning,当你执行生成的可执行文件的时候它就变成了未定义行为。
更多讨论参见
http://stackoverflow.com/questions/15576000/in-c-can-a-const-variable-be-modified-via-a-pointer
719

被折叠的 条评论
为什么被折叠?



