C++ 尝试在C+;中破解常量时的奇怪行为+;

C++ 尝试在C+;中破解常量时的奇怪行为+;,c++,memory,pointers,C++,Memory,Pointers,可能重复: 我正在学习C++,而且对指针非常感兴趣。我试图改变一个常量的值(我的老师称之为后门,请澄清我是否错了),如下所示: const int i = 0; const int* pi = &i; int hackingAddress = (int)pi; int *hackingPointer = (int*)pi; *hackingPointer = 1; cout << "Address:\t" << &i << "\t"

可能重复:

我正在学习C++,而且对指针非常感兴趣。我试图改变一个常量的值(我的老师称之为
后门,请澄清我是否错了),如下所示:

const int i = 0;

const int* pi = &i;

int hackingAddress = (int)pi;
int *hackingPointer = (int*)pi;

*hackingPointer = 1;

cout << "Address:\t" << &i << "\t" << hackingPointer << endl;
cout << "Value:  \t" << i << "\t\t" << *hackingPointer << endl;

system("PAUSE");

return 0;
const int i=0;
常数int*pi=&i;
int hackingAddress=(int)pi;
int*hackingPointer=(int*)pi;
*hackingPointer=1;

CUT> P>你发现了一个C++开发人员称之为未定义行为的小东西。您告诉编译器“
i
是一个值为0的常量”。因此,当您向编译器询问
i
的值时,它会告诉您该值为0

尝试更改常量的值会违反编译器的假设(即常量将是常量),因此编译器将生成无效或不一致的代码

< C++ >有很多情况,在没有编译器将其作为错误的情况下,可以做某事,但是结果是未定义的。如果你这样做,你就会得到你所看到的结果。编译器做了一些奇怪和意想不到的事情

哦,如果你的老师想从这样的例子中教你任何东西,他错了,你应该非常害怕

只有这样的代码才能保证:

编译器可以做任何它喜欢的事情

编写代码时,您与编译器有一个隐式约定:

“如果我编写了明确定义的C++代码,那么你就把它转换成一个可执行的,它的效果与C++标准所描述的相同”


当你这样做的时候,你违反了合同。然后编译器也不必遵循它。如果你给编译器代码没有按照C++标准定义的那么好,那么它就不能,也不会创建一个C++ C++标准所指定的可执行文件。

< p>你发现了一个C++开发者称为未定义行为的小东西。您告诉编译器“
i
是一个值为0的常量”。因此,当您向编译器询问
i
的值时,它会告诉您该值为0

尝试更改常量的值会违反编译器的假设(即常量将是常量),因此编译器将生成无效或不一致的代码

< C++ >有很多情况,在没有编译器将其作为错误的情况下,可以做某事,但是结果是未定义的。如果你这样做,你就会得到你所看到的结果。编译器做了一些奇怪和意想不到的事情

哦,如果你的老师想从这样的例子中教你任何东西,他错了,你应该非常害怕

只有这样的代码才能保证:

编译器可以做任何它喜欢的事情

编写代码时,您与编译器有一个隐式约定:

“如果我编写了明确定义的C++代码,那么你就把它转换成一个可执行的,它的效果与C++标准所描述的相同”


当你这样做的时候,你违反了合同。然后编译器也不必遵循它。如果你给编译器代码没有按照C++标准定义的那么好,那么它就不能,也不会创建一个C++标准所指定的可执行文件。

< P>不允许改变常量的值,实际上它是未定义的行为,因此程序可以做任何事情。p>
在本例中,编译器似乎在编译时优化了读取,因为它知道该值是固定的。当您尝试更改时,许多实现可能会崩溃,但您不能也不应该打赌或依赖任何未定义行为的结果。

不允许更改常量的值,事实上它是未定义的行为,因此您的程序可以作为结果执行任何操作


在本例中,编译器似乎在编译时优化了读取,因为它知道该值是固定的。当您尝试更改它时,许多实现可能会崩溃,但您不能也不应该打赌或依赖任何未定义行为的结果。

编译器似乎已经优化(内联int const value)


cout编译器似乎已经优化了(内联int const值)


还有,从今天早些时候开始:@Mankarse哇,也许那是我的朋友。我们之前讨论过这个问题,我不知道他在我之前的StackOverflow上发了帖子:)我应该投票删除吗?还有,从今天早些时候开始:@Mankarse哇,也许那是我的朋友。我们之前讨论过这个问题,我不知道他在我之前的StackOverflow上发布了:)我应该投票删除吗?谢谢你的解释。我的老师没有教我这个,我发现这很有趣,我自己也试过,当我问他这个结果时,他也无法解释为什么。无论如何,我有一个有趣的经历,谢谢你的清晰解释:)谢谢你的解释。我的老师没有教我这个,我发现这很有趣,我自己也试过,当我问他这个结果时,他也无法解释为什么。无论如何,我有一个有趣的经历,谢谢你的明确解释:)
cout << "Value:  \t" << i << "\t\t" << *hackingPointer << endl;
cout << "Value:  \t" << 0 << "\t\t" << *(0x0044ff28) << endl;