& 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
答案 0 :(得分:6)
因为undefined behavior。您正在修改常量数据。 const_cast
应该是一个很大的暗示。
答案 1 :(得分:5)
对象声明为const
,它的定义确实是const object
。这意味着修改该对象的结果是未定义的。
未定义意味着它完全取决于编译器想要对代码执行的操作。在你的情况下,似乎编译器在只读内存中分配了真正的const。当您将此函数传递给非常量指针时,编译器可能已将该函数与另一个包含类似值的内存一起提供。但那只是我的推测。
对@FreeNickName的评论进行了编辑: -
由于两个指针的地址(一个在主函数中,另一个在函数中)是相同的,我认为上面没有给出正确/完整的图片。也许编译器只是忽略了该增量指令,因为它被应用于只读的内存。