簡體   English   中英

C結構,指向結構的聯合指針

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM