非常量指针是否可以修改常量变量int c++



这是我的测试代码:

#define print(A) cout << #A <<  " = " << A <<  endl;
int main()
{
    const int e = 2;
    int *p = (int *)&e;
    *p = 4;
    print(e);
    print(*p);
    print(&e);
    print(p);
}

结果:

e = 2;
*p = 4;
&e = 0xbfc6b458;
p = 0xbfc6b458;

既然"p"根据它们相同的地址指向"e",那么*p和"e"怎么会不同呢???这可能很危险,对吧?

丢弃const是合法的;使用由此获得的指针(或引用)来(试图)修改CCD_ 2对象是非法的。

您的代码会导致未定义的行为;它可以做任何事情,而且不一定要有任何意义。

以任何方式修改常量变量都会导致未定义的行为
是的,这很危险
未定义的行为意味着任何行为都是可能的,并且您不能期望任何有效的行为。编译器可以自由地给你任何结果,标准允许这样做。一旦调用UB,程序就不再是有效的程序。所以最好是避免任何导致UB的代码。

它们可能不同,因为"e"是一个常量,所以任何合适的编译器都会在编译时插入该值,而不是从内存中读取。

既然你取了地址,它仍然有一个"真实"的变量,但它并没有实际用于你的情况。

你很"幸运",你可以修改这个值;由于它被声明为"const",编译器本可以将它放入只读内存中。

无论哪种方式,修改常量值都会产生"未定义的行为"。幸运的是,你没有用愚蠢的游戏摧毁世界。

您正试图写入一个常量变量(是的,这个名称很矛盾,但我离题了),这是未定义的行为。

您正在丢弃const。这给了你错误的价值,这就是未定义的行为。应该是

int e = 2;
int* p = (int *)&e;
*p = 4;

const int e = 2;
const int* p = (const int *)&e;
*p = 4;

后一个会给您带来编译错误,因为您正在编写常量。

定义变量:

 const int e = 2;

指令const告诉c/c++编译器检查e变量的L值,编译器将阻止您的代码为e分配新值。

int* p = (int *)&e;

p是一个指针(也是int 4字节),可以分配任何值,p=(((int*)e)-2)+2。编译器不需要检查*p是否为常量。我认为这是一种灵活的c/c++语言,更好的方法是避免指针。

最新更新