typedeffed 구조체와 공용체가 있습니다. 공용체에는 구조체와 단일 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
여기서 무슨 일이 일어나고 있는지 정확히 설명 할 수있는 사람은 누구입니까 (구조체 포인터에 대한 유니온 포인터, 유니온 멤버에게 연기 됨)?
둘째 : foo
비트 1,3 및 4에 추가로 비트 22가 설정된 이유는 무엇입니까?
정의되지 않은 동작으로 인해 비트 22가 설정되었습니다. 완전히 초기화하지 않은 지역 변수를 만든 다음 5 비트를 설정합니다. 나머지 비트는 초기화되지 않은 로컬의 경우에 발생하는 모든 것입니다.
질문의 첫 부분에 대해 ... 명확하지 않은 것은 무엇입니까? 귀하의 질문 ( union pointer to a struct pointer, defererenced to a union member
)이 저절로 대답하는 것 같습니다. 이미있는 유형으로 무언가를 캐스팅해도 효과가 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다