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

use*_*291 1 c++

&i(内部主函数)和p(内部函数函数)都保持相同的地址.我知道一个常量对象/变量不能被修改但我能够在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;
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

000000000022fe44 48
000000000022fe44 47
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

由于未定义的行为.您正在修改常量数据.这const_cast应该是一个很大的暗示.


rav*_*avi 5

const在它的定义点声明的对象确实是一个const object.这意味着修改该对象的结果是未定义的.

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

编辑回复@FreeNickName的评论: -

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

  • @FreeNickname`const int i = 47;`是常量.当编译器看到这个时,允许优化远离加载值_from_`i`,而是使用你分配给它的任何值.当你在`main`中调用`printf`时,它正在执行`printf("%p%d \n",&i,47)`.当你在`func`中打印它时,它不知道它是`const`并从内存中加载它.这就是为什么你得到两个不同的值. (3认同)