为什么分配给常量via指针没有效果?

时间:2017-08-22 16:18:36

标签: c++ pointers const

在下面的例子中,'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;
}

输出:

address of local: 0x7ffd946bd9c4
value of ptr: 0x7ffd946bd9c4
Initial value of local : 10 
Initial value of *ptr : 10 
Modified value of local: 10 
Modified value of *ptr: 100 
address of local: 0x7ffd946bd9c4 
value of ptr: 0x7ffd946bd9c4

2 个答案:

答案 0 :(得分:3)

该行:

*ptr = 100;

是未定义的行为。原因是因为ptr指向const对象。你通过抛弃const-ness来进行编译,但语言仍然说实际修改一个声明为const的对象是非法的:http://en.cppreference.com/w/cpp/language/const_cast

未定义行为的存在基本上意味着您的程序可以在不同的编译器/优化级别上执行许多不同的,奇怪的事情。简而言之,不要修改const个对象,现在要避开const_cast。这通常是糟糕设计的标志;它的合法用途相对较少,你可以随时学习。以下是const_cast How do I remove code duplication between similar const and non-const member functions?罕见有效使用示例的链接。这种技术消除了代码重复,但从根本上说,当只有指针是const限定的时候,它依赖于丢弃常量,但是已知底层对象不是const。

实际const值与const别名指针/引用之间的差异在C ++中非常重要。

答案 1 :(得分:-1)

本声明:

   int *ptr = (int*) &local;

接着是

   *ptr = 100;

错了。标准调用这种类型的行为(通过指针分配与赋值目标的类型不匹配)“未定义的行为”,这意味着编译器不需要产生警告消息(如果它是好的但是这也意味着编译器不需要生成以您期望的方式实现语句的代码。

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