Tag: 工会

联合和结构初始化

我偶然发现了一个基于C中的工会的代码。这是代码: union { struct { char ax[2]; char ab[2]; } s; struct { int a; int b; } st; } u ={12, 1}; printf(“%d %d”, u.st.a, u.st.b); 我只是不明白为什么输出是268 0 。 这些值是如何初始化的? 工会如何运作? 输出不应该是12 1 。 如果有人能够详细解释这里到底发生了什么,那就太好了。 我在Windows 7上使用32位处理器。

使用联合在具有共同初始序列的两个结构之间进行转换是否合法且定义良好的行为(参见示例)?

我有一个公开面向结构A和内部结构B的API,需要能够将结构B转换为结构A.以下代码在C99(和VS 2010 / C89)和C中是合法且定义良好的行为 ++ 03 / C ++ 11? 如果是,请解释是什么使它明确定义。 如果不是,那么在两种结构之间进行转换的最有效和跨平台的方法是什么? struct A { uint32_t x; uint32_t y; uint32_t z; }; struct B { uint32_t x; uint32_t y; uint32_t z; uint64_t c; }; union U { struct A a; struct B b; }; int main(int argc, char* argv[]) { U u; ubx = 1; […]

C中的联合与结构

这个问题背后的想法是理解使用联合的更深层次的概念,并以不同的方式使用它以节省记忆。我的问题是 – 我的问题是 – 让我们说有一个结构 struct strt { float f; char c; int a; } 并且在联合中表示相同的结构 union unin { float f; char c; int a; } 如果我一个接一个地为结构成员分配值然后打印它们,它就会打印出来。 但是在联盟的情况下它不会发生,一些覆盖正在进行中。 所以我需要找到一个方法,它可以存储f,c,a的值使用union,然后我可以打印相同的。 (应用任何操作或任何东西..)但我正在寻找这种技术..任何人可以指导我或给我任何想法?

有没有办法通过联合访问各个位?

我正在写一个C程序。 我想要一个我可以作为char访问的变量,但我也可以访问特定的位。 我以为我可以使用像这样的工会…… typedef union { unsigned char status; bit bits[8]; }DeviceStatus; 但是编译器不喜欢这个。 显然你不能在结构中使用位。 那我该怎么做呢?

使用union变量分配两个值

变量a由值10赋值,变量b由变量v赋值为20,然后它给出的输出为20而不是10.我得不到它。 #include int main() { union var { int a, b; }; union var v; va=10; vb=20; printf(“%d\n”, va); return 0; } 我执行了程序,输出为20。

C联盟输出不清楚

理解工会及其运作方式我遇到了一些麻烦。 #include union date { int year; char month; char day; }; int main() { union date birth; birth.year = 1984; birth.month = 7; birth.day = 28; printf(“%d, %d, %d\n”, birth.year, birth.month, birth.day); return 0; } 因为它是一个联合,它会给我4个字节,因为int是这个联合中给出的最高类型。 这就是我从阅读中得到的所有内容,我不知道输出为什么 1820, 28, 28

定义可以访问位,半字节,字节的联合

union bits { unsigned int a : 1; unsigned int b : 2; unsigned int c : 3; unsigned int d : 4;“ unsigned char x[2]; unsigned int z; }; 假设在32位的并集中,我需要使用单个位,或一组位,或半字节或字节。 有没有办法来定义联盟。

联合黑客进行端序测试和字节交换

对于联合,写入一个成员并从其他成员读取(char数组除外)是UB。 //snippet 1(testing for endianess): union { int i; char c[sizeof(int)]; } x; xi = 1; // writing to i if(xc[0] == 1) // reading from c[0] { printf(“little-endian\n”); } else { printf(“big-endian\n”); } //snippet 2(swap bytes using union): int swapbytes() { union // assuming 32bit, sizeof(int)==4 { int i; char c[sizeof(int)]; } x; xi […]

通过指针访问C联合成员

通过指针访问union成员(如下例所示)会导致C99中的未定义行为吗? 意图似乎很清楚,但我知道在别名和工会方面存在一些限制。 union { int i; char c; } u; int *ip = &u.i; char *ic = &u.c; *ip = 0; *ic = ‘a’; printf(“%c\n”, uc);

联合和结构包装问题

我正在编写一些软件,其中每个位必须精确(它是CPU的),所以__packed非常重要。 typedef union{ uint32_t raw; struct{ unsigned int present:1; unsigned int rw:1; unsigned int user:1; unsigned int dirty:1; unsigned int free:7; unsigned int frame:20; } __packed; }__packed page_union_t; 那是我的结构和结合。 但它不起作用: page_union_t p; //….. //This: p.frame=trg_page; p.user=user; p.rw=rw; p.present=present; //and this: p.raw=trg_page<<12 | user<<2 | rw<<1 | present; 应该创建相同的uint32。 但他们并没有创造同样的东西。 有什么我看不出我的工会有问题吗?