写入是否超出联合 UB 中较小尺寸成员的尺寸?

Is writing beyond the size of smaller size member in a union UB?

根据我对union的了解,它就像一个struct,主要区别在于union所有成员共享相同的内存。虽然每个结构的成员都有自己独特的内存。

还可以通过写入成员来启用成员,这对其他成员来说是独有的。并试图从禁用成员读取被认为是 UB。

联合的大小与最大的成员数据类型一样大。好的。但我的想法是:

如果我有一个数组,假设字符是我联合体的成员,并且其大小小于联合体中最大的成员。因此,当启用此成员(字符数组)时,我可以写入超出其大小的内容吗?但不超过最大成员的大小。在我的情况下(双).?

#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] = '[=10=]'; // eigth byte

    //book.szTitle[8] = '[=10=]'; // 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] = '[=13=]'; // eigth byte

仍然是未定义的行为

tl;dr 访问超出其范围的数组是未定义的行为。时期。没有 exceptunless 子句。