是否在联盟UB中写出超出较小规模成员的大小?

时间:2017-12-18 23:37:40

标签: c++ language-lawyer unions

根据我对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] = '\0'; // eigth byte

    //book.szTitle[8] = '\0'; // crash
    //book.szTitle[9] = '!';  // crash

    cout << book.szTitle << endl;

    cin.get();
    cout << endl << endl << endl;
    return 0;
}

上面的程序在许多编译器上工作正常但我很想知道它是否正确。

谢谢。

1 个答案:

答案 0 :(得分:4)

viewDidAppear

不,这不正确。这是未定义的行为

topViewController

不,这不正确。这是未定义的行为

book.szTitle[4] = 'o'; // is this correct?

不,这不正确。这是未定义的行为

book.szTitle[5] = 'm'; // is this correct?

仍然未定义的行为

tl; dr 访问其边界之外的数组是未定义的行为。期。否除非子句。