写入是否超出联合 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 访问超出其范围的数组是未定义的行为。时期。没有 except 或 unless 子句。
根据我对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 访问超出其范围的数组是未定义的行为。时期。没有 except 或 unless 子句。