类型转换的c ++指针和非类型转换的指针指向相同的位置,但是给出不同的值

时间:2019-02-23 19:10:30

标签: c++ pointers reference typecasting-operator

在以下代码中

#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

1 个答案:

答案 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