繁体   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