我已经阅读了有关如何将结构存储在内存中的想法,并提出了一种将二进制数据直接类型转换为结构的想法。我试图将类型转换为普通的struct类型,但是编译器抱怨仅对指针类型的类型转换是有效的(请参阅main的第一行)。 为什么?
在那之后,我使用了一个指针来进行结构类型转换,该转换显然成功了。当我尝试访问struct的变量时,我得到一个无声的错误退出代码11。将二进制类型强制转换为struct的正确方法是什么?或其他任何类型(例如数组)。可能在C中使用?
typedef unsigned char UINT8;
struct L{
UINT8 ui8:4;
UINT8 ui8v2:4;
UINT8 ui8v3;
UINT8 ui8v4;
};
typedef struct L L, *PL;
int main(){
// L myStruct = (L)0b000000010000000000000001; gives error => pointer type required
PL pMyStruct = (PL)0b000000010000000000000001; // compiles normally
printf("ui8: %d", pMyStruct->ui8); // but returns error code 11 at runtime
}
答案 0 :(得分:1)
没有一种可移植的方式将一种类型强制转换为结构类型化的数据。
您可以使用指针,结构或memcpy来修饰类型,但该类型不可移植,并且可能会违反严格的别名规则:
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef struct {
uint8_t ui8:4;
uint8_t ui8v2:4;
uint8_t ui8v3;
uint8_t ui8v4;
}L;
int main(){
unsigned val = 0b000000010000000000000001;
L *myStructPtr = (L *)&val;
L myStruct;
memcpy(&myStruct, &val, sizeof(myStruct));
printf("0x%02x \n", myStructPtr -> ui8);
printf("0x%02x \n", myStructPtr -> ui8v2);
printf("0x%02x \n", myStructPtr -> ui8v3);
printf("0x%02x \n----\n", myStructPtr -> ui8v4);
printf("0x%02x \n", myStruct.ui8);
printf("0x%02x \n", myStruct.ui8v2);
printf("0x%02x \n", myStruct.ui8v3);
printf("0x%02x \n", myStruct.ui8v4);
}