【问题标题】:Modifying a const int in C++ [duplicate]在 C++ 中修改 const int [重复]
【发布时间】:2014-02-18 00:52:37
【问题描述】:

运行下面的代码显示&x=ptr,那么x和*ptr怎么不相等呢?

const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;

cout << &x << " " << x << "  " << ptr <<"  " <<*ptr;  //output : 0012FF60 10  0012FF60  11

【问题讨论】:

标签: c++ pointers constants


【解决方案1】:

只有在遵守规则的情况下,才需要 C++ 实现才能使程序运行。你违反了规则。 C++ 实现的行为可能是这样的:

  • 因为x 被声明为const,C++ 实现知道只要你遵守规则,它的值就不会改变。因此,无论在哪里使用 x,C++ 实现都使用 10,而无需检查 x 是否已更改。
  • 因为*ptr 指向一个非常量int,所以实际上执行了对它的存储和读取。这些“工作”是因为它指向的内存(代表x)实际上并未被操作系统标记为只读。因此,您可以进行修改,尽管您不应该这样做。

请注意,如果您遵守规则,C++ 实现的行为会起作用。如果您没有修改x,那么在x 出现的任何地方使用10 都可以正常工作。或者,如果您没有将 x 声明为 const,那么 C++ 实现不会假定它始终为 10,因此无论何时访问 x,它都会获得更改后的值。这就是 C++ 标准对实现的所有要求:如果你遵守规则,它就可以工作。

如果您不遵守规则,C++ 实现可能会以看似不一致的方式中断。

【讨论】:

    【解决方案2】:

    您正在修改声明为 const 的对象。这是未定义的行为;该程序不需要做任何明智的事情。它可能看起来工作正常,或给出微妙的错误答案,或段错误,或执行攻击者提供的任意代码。通常的夸张是,程序允许demons飞出你的鼻子。

    【讨论】:

    • 你能详细说明一下吗? “任何事情都可能发生”是什么意思?
    • @Nazgol:这意味着语言标准对代码的行为只字未提。在最坏的情况下,它可以完全按照您的预期运行(这是最坏的情况,因为这意味着很难追踪错误)。
    • @Nazgol 事情可能会奏效。事情可能会破裂。你可能会崩溃。您的硬盘驱动器可能会被格式化。真的,任何事情 - 当它发生时,它不会令人愉快。
    • 当他说“任何事情都可能发生”时,这意味着无法保证任何合理的事情都会发生。当你试图这样做时,也许恶魔会从你的鼻子里飞出来。也许程序会格式化你的硬盘。
    • @Nazgol 实际上,它可以打印“0012FF60 10 0012FF60 11”(就像您的情况一样),它可以打印“0012FF60 10 0012FF60 10”(如您所料)。可以想象,它也可能崩溃。就标准而言,任何行为都是合法的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多