& i和p都指向相同的变量,但显示不同的结果?

时间:2014-12-31 14:18:28

标签: c++

& i(在main函数内)和p(在func函数内)都保持相同的地址。我知道一个常量对象/变量不能被修改但我能够在func函数中使用(* p)++增加变量i,但结果并没有反映在main函数中。那是为什么?

#include <iostream>
using namespace std;

void func(int *p){
    (*p)++;
    printf("%p %d\n", p, *p);
}

int main(int argc, char **argv){
    const int i = 47;
    const int *p = &i;
    func(const_cast<int *>(p));
    printf("%p %d\n", &i, i);
    return 0;
}

我收到了这个输出:

000000000022fe44 48
000000000022fe44 47

2 个答案:

答案 0 :(得分:6)

因为undefined behavior。您正在修改常量数据。 const_cast应该是一个很大的暗示。

答案 1 :(得分:5)

对象声明为const,它的定义确实是const object。这意味着修改该对象的结果是未定义的。

未定义意味着它完全取决于编译器想要对代码执行的操作。在你的情况下,似乎编译器在只读内存中分配了真正的const。当您将此函数传递给非常量指针时,编译器可能已将该函数与另一个包含类似值的内存一起提供。但那只是我的推测。

对@FreeNickName的评论进行了编辑: -

由于两个指针的地址(一个在主函数中,另一个在函数中)是相同的,我认为上面没有给出正确/完整的图片。也许编译器只是忽略了该增量指令,因为它被应用于只读的内存。