gpt4 book ai didi

c - 为什么我们必须总是读取用 C union 写入的最后一个元素?

转载 作者:行者123 更新时间:2023-11-30 20:54:56 24 4
gpt4 key购买 nike

我正在阅读一些关于枚举 union 的幻灯片,其中一张幻灯片显示:

You must always read the last element you write.

然后是以下代码:

union Value {
int int_value;
float float_value;
char *str_value;
};

int main(int argc, char *argv[]) {
union Value v;
v.str_value = "hi";
v.int_value = 100;

printf("v = %s\n", v.str_value); /* undefined behavior! */
}

我们总是必须读取我们写入的最后一个元素,这意味着什么?为什么访问 union v 的字段 str_value 是未定义的行为?

最佳答案

union 背后的概念如下:它是一个“结构”,占据所包含的最大(以内存而言)数据类型的大小。

union myunion
{
char letter;
int number;
};

union 将占用 1 int 的大小,即 4/8 字节,具体取决于计算机。这意味着字符和数字将共享相同的空间。这意味着如果您执行以下操作:

myunion.letter='a';
myunion.number=2000;

您可能会跳过 union 中的其余变量。这意味着当您尝试拾取该字母时,该值将不再是“a”。这不仅仅是未定义的行为,只是您要跳过其余变量( union 背后的全部要点),您实际上可以根据 union 中字节的分布知道 char 值是什么。这就是为什么它被解释为仅读取您写入的最后一个元素,因为其余元素可能会被修改。

关于c - 为什么我们必须总是读取用 C union 写入的最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com