C++ 为什么通过指针分配给常数没有效果?

C++ 为什么通过指针分配给常数没有效果?,c++,pointers,constants,C++,Pointers,Constants,在下面的示例中,“ptr”指向常量变量“local”。为什么通过赋值“*ptr”修改“local”不会更改“local”的值 #include <stdio.h> int main(void) { const int local = 10; int *ptr = (int*) &local; printf("address of local: %p \n", &local); printf("value of ptr: %p \n",

在下面的示例中,“ptr”指向常量变量“local”。为什么通过赋值“*ptr”修改“local”不会更改“local”的值

#include <stdio.h>
int main(void)
{
    const int local = 10;
    int *ptr = (int*) &local;

    printf("address of local: %p \n", &local);
    printf("value of ptr: %p \n", ptr);
    printf("Initial value of local : %d \n", local);
    printf("Initial value of *ptr : %d \n", *ptr);

    *ptr = 100;
    //*((int*)&local) = 1000;

    printf("Modified value of local: %d \n", local);
    printf("Modified value of *ptr: %d \n", *ptr);
    printf("address of local: %p \n", &local);
    printf("value of ptr: %p \n", &(*ptr));

    return 0;
}
本声明:

   int *ptr = (int*) &local;

   *ptr = 100;
这是错误的。标准将这种类型的行为(通过与赋值目标类型不匹配的指针赋值)称为“未定义的行为”,这意味着编译器不需要生成警告消息(如果生成了,那就更好了),但这也意味着编译器不需要生成按预期方式实现语句的代码

您可以阅读有关未定义行为和相关语言问题的更多信息

*ptr = 100;
是未定义的行为。原因是因为
ptr
指向一个
const
对象。您通过舍弃const进行编译,但该语言仍然表示实际修改声明为const的对象是非法的:

存在未定义的行为基本上意味着您的程序可以在不同的编译器/优化级别上执行许多不同的、奇怪的操作。简而言之,不要修改
const
对象,暂时不要修改
const\u cast
。这通常是糟糕设计的标志;它的合法用途相对较少,你可以边学边用。这里有一个链接,指向一个罕见的有效使用
const_cast
:。这种技术消除了代码重复,但从根本上讲,它依赖于在只有指针符合常量条件,但底层对象已知不是常量时丢弃常量


<>实际的<代码> const <代码>值,以及<>代码> const <代码>混淆指针/引用在C++中非常重要。

因为它是一个未定义的行为,它丢弃了一个TopPrave<代码> const Objult.NWP,实际上,这不是真的,它本身不是UB。只有UB才能真正修改。一般情况下,C++中的指针直接导致UB的情况很少(我确信有例外)。通常是使用了一个不正确的UB类型的强制转换指针。如果你说某个东西是常量,则取决于编译器如何处理它。据你所知,它被放在只读存储器的某个地方,因为你说过你不会改变它。现在您正在尝试编辑它。为什么您希望它会更改?在许多情况下,const可能根本没有地址(机器代码中使用的是直接值10)。谢谢大家:)。现在我明白了。不,这个答案是错误的,演员本身不是UB。只有赋值是。丢弃常量不是UB,有时必须使用一些遗留的C接口。丢弃常量后修改值是错误的。当然,您是正确的。我只是想简化一下。谢谢,尼尔·弗里德曼。我会接受你的回答。@HeChen-那将是明智的:p