根据我对union
的了解,它就像一个struct
,主要区别在于union
所有成员共享相同的内存。虽然每个结构体的成员都有自己独特的内存。
还可以通过向成员写入来启用该成员,这是其他成员独有的。尝试读取禁用成员的内容被视为 UB。
union 的大小与最大成员数据类型一样大。好的。但我的想法是:
如果我有一个数组,假设字符是我的 union 的成员,并且其大小小于 union 中最大的成员。因此,当启用此成员(字符数组)时,我可以写入超出其大小的内容吗?但不超过最大成员的大小。就我而言(双)。?
#include "stdafx.h"
#include <iostream>
using namespace std;
enum TYPE { PAGE, TITLE, WEIGH };
union UBook {
TYPE tp;
int nPages;
char szTitle[4]; // only 4 bytes
double weight;
};
int main() {
cout << sizeof(UBook) << endl; // 8 bytes (size of double)
UBook book;
book.szTitle[0] = 'W'; // for sure correct
book.szTitle[1] = 'e'; // for sure correct
book.szTitle[2] = 'l'; // for sure correct
book.szTitle[3] = 'c'; // for sure correct
book.szTitle[4] = 'o'; // is this correct?
book.szTitle[5] = 'm'; // is this correct?
book.szTitle[6] = 'e'; // is this correct?
book.szTitle[7] = '\0'; // eigth byte
//book.szTitle[8] = '\0'; // crash
//book.szTitle[9] = '!'; // crash
cout << book.szTitle << endl;
cin.get();
cout << endl << endl << endl;
return 0;
}
上面的程序在许多编译器上都能正常工作,但我很想知道它是否正确。
谢谢。
最佳答案
book.szTitle[4] = 'o'; // is this correct?
不,这是不正确的。这是未定义的行为
book.szTitle[5] = 'm'; // is this correct?
不,这是不正确的。这是未定义的行为
book.szTitle[6] = 'e'; // is this correct?
不,这是不正确的。这是未定义的行为
book.szTitle[7] = '\0'; // eigth byte
仍然未定义的行为
tl;dr 访问超出其范围的数组是未定义的行为。时期。没有除了或除非子句。
关于c++ - 写入是否超出 union UB 中较小尺寸成员的尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878007/