this问题中的联合会不会导致UB在以下情况下使用:
union Data
{
unsigned int intValue;
unsigned char argbBytes[4];
};
Data data;
data.intValue = 1235347;
unsigned char alpha = data.argbBytes[0]; //UB?我认为9.5/1在标准中是:
在一个联合中,最多一个数据成员可以在任何时候都是活动的,也就是说,最多一个数据成员的值可以在任何时候存储在一个联合中。
发布于 2010-08-13 08:19:45
一般来说,将一种类型的值写入一个联合,然后将其作为另一种类型读取是未定义的行为,这是正确的。另一方面,iirc标准显式地允许任何可以转换为char数组的内容。这从来没有100%清楚的优先,但所有的实现,我曾经使用允许联合铸造做你想做的任何事情。
发布于 2010-08-13 08:08:28
我认为这是不确定的,因为您所做的是特定于平台的工作。阿尔法将以不同的值结束,这取决于您的平台是大端还是小端。
但是,您所展示的技术很大程度上等同于执行reinterpret_cast。
我认为标准是指出,您不能在两个成员中存储不同的值(因为它们在内存中重叠)。
union发明的真正原因是为了让人们能够在更小的内存中容纳更多的数据。传统上,除了联合之外,您还会将一些标记(可能存储在位掩码中的一两个标记)保存在联合之外,以记住哪个联合成员是活动的。使用此标记时,必须仔细编写对联合的访问代码,以便只读取活动成员。
发布于 2010-08-13 08:21:03
从帖子中还不清楚平台上“int”的大小是多少。假设32位整数和8位字符,即(Int) == 4的大小.
它也不清楚什么是终端的机器。让我们假设小安迪安。
在这种情况下,0x12D993 (小数1235347)将存储为
0x93 0xd9 0x12 0x00 (增加地址)
当通过' argbBytes‘访问这个内存时,argbBytes的值实际上取决于机器的端点。因此,它不是一个未定义的行为,而是一个实现定义的行为。
https://stackoverflow.com/questions/3474990
复制相似问题