Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是*(双*)&;a怎么办?_C++_Type Punning - Fatal编程技术网

C++ 什么是*(双*)&;a怎么办?

C++ 什么是*(双*)&;a怎么办?,c++,type-punning,C++,Type Punning,这里(双*)的目的是什么? 我明白: double d1 = *&a; 将给出地址a处的值,但添加(双*)将值1.4854e-313存储到d1中。为什么会这样?什么是类型双关语?还有,我是否从未定位的内存中写入或读取 int main () { int a = 17; double d1 = *(double*)&a ; std :: cout << "\na = " << a << ", &a = " <

这里(双*)的目的是什么? 我明白:

double d1 = *&a;
将给出地址a处的值,但添加(双*)将值1.4854e-313存储到d1中。为什么会这样?什么是类型双关语?还有,我是否从未定位的内存中写入或读取

int main () {
    int a = 17;
    double d1 = *(double*)&a ;
    std :: cout << "\na = " << a << ", &a = " << & a ;
    std :: cout << "\nd1 = " << d1 << ", &d1 = " << & d1 ;
}
int main(){
INTA=17;
双d1=*(双*)&a;

std::cout这是类型双关,但它也是未定义的行为。
int
在大多数平台上的大小与
double
不同,这意味着将
int
指针投射到
double
指针,然后从中读取,将从您不应该访问的堆栈数据中读取

实际上,发生的是
d1
被分配存储在
a
及其周围的位。因为这些位是任意的(可能从堆栈中读取垃圾),所以它的值可以是任何值


不用说,你不应该这样做。在理想情况下,类型双关只是勉强定义的行为,而且肯定没有使用你在这里使用的方法。

这是类型双关,但也是未定义的行为。
int
与大多数平台上的
double
大小不同,这意味着将
int
指针投射到
double
指针,然后从中读取时,将从您不应该访问的堆栈数据中读取

实际上,发生的是
d1
被分配存储在
a
及其周围的位。因为这些位是任意的(可能从堆栈中读取垃圾),所以它的值可以是任何值


不用说,你不应该这样做。在理想情况下,类型双关只是一种勉强定义的行为,而且肯定没有使用你在这里使用的方法。

这里发生的事情是,你正在重铸
a
,它是一个
int
,强制重铸为一个
double

让我把它分解一下:

&a
获取指向变量
a
的类型为
int*
的指针

然后,使用
(double*)
将此指针重铸到类型
double*

最后,使用
*
将强制转换的指针解引用到
双精度

总之,您将指针指向
a
,将其重新命名为
double*
,取消对它的引用,并将值赋给变量
d1

这被称为类型双关,正如其他人所提到的,这是不好的,因为两种类型
int
double
可能在内存中占用不同的字节数


假设
int
在您的系统上定义为4个字节,
double
为8个字节。那么这是一个问题,因为您告诉您的系统“嘿,看,您可以在这个地址读取接下来的8个字节,而不是实际有效数据的4个字节。”谁知道接下来的4个字节是什么?行为是未定义的,你基本上可以保证读垃圾。

这里发生的事情是你正在重铸
a
,它是一个
int
,强制重铸为一个
double

让我把它分解一下:

&a
获取指向变量
a
的类型为
int*
的指针

然后,使用
(double*)
将此指针重铸到类型
double*

最后,使用
*
将强制转换的指针解引用到
双精度

总之,您将指针指向
a
,将其重新命名为
double*
,取消对它的引用,并将值赋给变量
d1

这被称为类型双关,正如其他人所提到的,这是不好的,因为两种类型
int
double
可能在内存中占用不同的字节数


假设
int
在您的系统上定义为4个字节,
double
为8个字节。那么这是一个问题,因为您告诉您的系统“嘿,看,您可以在这个地址读取接下来的8个字节,而不是实际有效数据的4个字节。”谁知道接下来的4个字节是什么?行为是未定义的,你基本上可以保证读取垃圾。

它的功能与下面的代码类似。如果它赋值
int
并获得
double
,它也有UB,但它不会访问外来内存,至少不会破坏严格的别名

union mixed_types {
    int a;
    double d1;
};

int main () {
    mixed_types bad;
    bad.a = 17;
    double d1 = bad.d;
    std :: cout << "\na = " << a << ", &a = " << & a ;
    std :: cout << "\nd1 = " << d1 << ", &d1 = " << & d1 ;
}
联合混合类型{
INTA;
双d1;
};
int main(){
混合型不良;
不好,a=17;
双d1=坏d;

std::cout与下面的代码类似。如果它赋值
int
并获得
double
,它也有UB,但它不会访问外部内存,至少不会破坏严格的别名

union mixed_types {
    int a;
    double d1;
};

int main () {
    mixed_types bad;
    bad.a = 17;
    double d1 = bad.d;
    std :: cout << "\na = " << a << ", &a = " << & a ;
    std :: cout << "\nd1 = " << d1 << ", &d1 = " << & d1 ;
}
联合混合类型{
INTA;
双d1;
};
int main(){
混合型不良;
不好,a=17;
双d1=坏d;

cout提示:int的长度(字节)是多少?double呢?如果你试图读取int所在的内存,但从中读取了double,你能保证只读取自己的内存吗?未定义的行为,
a
不是double“什么是类型双关?”将对象的内存表示形式解释为不同类型的对象。在大多数情况下,它是UB。提示:长度是多少(以字节为单位)关于一个int?关于double呢?如果你试图读取int所在的内存,但你从中读取了double,你能保证你只读取自己的内存吗?未定义的行为,
a
不是double“什么是类型双关?”将一个对象的内存表示解释为一个不同类型的对象。在大多数情况下,它是UB。这相当于重新解释(a)
,对吗?@Barmar否,原因有几个,最大的原因是它