c++ - 写入是否超出 union UB 中较小尺寸成员的尺寸?

标签 c++ language-lawyer unions

根据我对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/

相关文章:

c++ - 如何检测不再响应的事件 x 组件?

c# - 如何在 C# 中创建这个结构?

c++ - 将 Qscintilla 库添加到 Qt Problems

c++ - 关闭 GTK 窗口

c++ - 有没有关闭计算机的C++函数?

c++ - 关于 const decltype(x)& 的问题

c - 字符常数总是正数吗?

java - 如何封装未经检查的强制转换以仅允许未经检查的泛型类型转换?

c++ - 如果我们只有一个成员,结构和 union 之间有什么区别吗?

c - union 声明C代码