[英]C struct, union pointer to struct
我有一个typedeffed结构和一个联合。 联合包含struct和单个uint32_t
。 目标是为foo
分配一个与结构中的“位”相对应的值。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
uint32_t valA :1;
uint32_t valB :1;
uint32_t valC :1;
uint32_t valD :1;
uint32_t valE :1;
} ValStruct_Type;
typedef union {
ValStruct_Type valStruct;
uint32_t valUint;
} ValUnion_Type;
uint32_t foo = 0;
int main(void)
{
ValStruct_Type Vals;
Vals.valA = 0x0;
Vals.valB = 0x1;
Vals.valC = 0x0;
Vals.valD = 0x1;
Vals.valE = 0x1;
ValStruct_Type *Vals_ptr;
Vals_ptr = &Vals;
foo = ((ValUnion_Type *)Vals_ptr)->valUint;
return 0;
}
foo变成:
Decimal: 4194330
Hex: 0x40001a
Binary: 10000000000000000011010
谁能确切解释这里发生了什么(指向结构指针的工会指针,而推迟给工会成员的工会指针?)?
其次:为什么除了1,3和4位之外,还要设置foo
22位?
由于未定义的行为,设置了位22。 您已经创建了一个从未完全初始化的局部变量,然后将其设置为5位。 剩下的位是碰巧的,未初始化的本地变量就是这种情况。
关于问题的第一部分...不清楚吗? 您的问题( union pointer to a struct pointer, defererenced to a union member
)似乎可以回答自己。 将某些内容强制转换为已经存在的类型无效。
定义并集时,您指示编译器为任何适合其成员的实例保留足够的内存。
当您键入一个位字段的定义时,它会被填充为某个字节大小(通常为4或8个字节,但在小写情况下可能为1个字节)。
由于仅为结构分配了足够的内存(请使用sizeof(ValStruct_Type)
检查),然后将其sizeof(ValStruct_Type)
转换为占用更多内存的并集,因此您将获得不确定的行为。
填满堆栈的那部分内容的任何内容都会被复制到foo
。
您大致所做的等于
char a = 0x1a;
int foo = *(int *)&a;
要获得正确的行为,您需要
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.