7

可能的重复:
邪恶的演员是否被邪恶的编译器打败了?

你好,

如果我可以通过指针修改常量,那么它的目的是什么?下面是代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 const int a = 10;
 int *p = (int *)&a;

 printf("Before: %d \n", a);
 *p = 2;
 /*a = 2; gives error*/

 printf("After: %d \n", *p);

 return 0;
}

输出:

之前:10
之后:2
按任意键继续。. .

使用 Visual Studio 2008。

4

2 回答 2

12

你可以修改这个值的原因是你做了一个指针类型转换,它去掉了constness:

int *p = (int *)&a;

这将 a const int*(即&a)类型转换为 a int *,允许您自由修改变量。通常编译器会警告你,但显式类型转换抑制了警告。

背后的主要理由const是防止您意外修改您承诺不会的内容。正如您所看到的,这不是神圣不可侵犯的,您可以不受惩罚地抛弃constness,就像您可以做其他不安全的事情一样,例如将指针转换为整数,反之亦然。这个想法是你应该尽量不要弄乱const,如果你这样做了编译器会警告你。当然,添加演员表会告诉编译器“我知道我在做什么”,因此在您的情况下,上述内容不会产生任何类型的警告。

于 2011-01-30T06:00:34.207 回答
9

如果我可以通过指针修改常量,那么它的目的是什么?下面是代码:

这是未定义的行为,应不惜一切代价避免:

§ C99 6.7.3p5

如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为是 undefined

于 2011-01-30T06:00:46.303 回答