[英]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.