在以下代码中
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
int *a;
const int b=5;
a=(int *)&b;
*a=6;
cout<<*a<<b<<endl;
cout<<a<<" "<<&b;
return 0;
}
b
的地址被类型转换并存储到a
中。据我所知,*a
必须指向与b
相同的位置,并且应赋予与b相同的值。获得a和&b的输出表明它们两个都指向相同的内存位置。
但是a *和b给出的输出值不同。如果我没有对指针进行类型转换,那么我对于* a和b的值将是相同的。有人可以帮我找到问题在哪里吗?。谢谢
65
0x7fff2e7969fc 0x7fff2e7969fc
答案 0 :(得分:2)
您正在尝试写一个声明为b
的变量(const
)。这是C ++中的undefined behavior
。未定义的行为意味着,程序可能会在此时执行任何操作,一切都有效,包括打印完全错误的数字甚至崩溃。
您首先答应b
是不变的,但您却违反了这一承诺。
编译器通过强迫您插入强制类型转换来提示您不允许执行的操作。没有(int*)
强制转换,您的代码将无法编译,因为它不是const正确的。围绕const
进行转换通常暗示某些东西不正确。在const
周围有强制转换的合法用途,但在诸如代码这样的情况下,基础变量实际上是const
的情况下就没有这种用法。
在允许您强制转换const
的情况下,都涉及一个非常量变量,并具有一个指向它的const指针,然后将const
指针转换为一个非常量变量,例如,由于您仍然保持逻辑常数,例如您保持着重要的不变性。但是在这些情况下,底层存储始终是非常量的。
这很可能是您所遇到的情况:
编译器记住您要为值5提供名称b
。它还意识到您正在使用指向b
的指针,因此,它还在堆栈上为b
保留了空间。除非您尝试读取它,否则很可能甚至不会费心将5放到堆栈上,但是您从不这样做。相反,您用6覆盖了堆栈中b
的位置。因此,print语句首先打印6(表示b在堆栈中的位置),然后打印5(编译器只是在您使用的所有位置插入5) b
。