Tag: 工会

访问c中的联盟成员

我对c语言中的联合有疑问 例如: typedef struct { int a; float c; }Type1; typedef struct { int b; char d; }Type2; union Select { Type1 type1; Type2 type2; }; void main() { Select* select; //can we access type1 first and then access type2 immediately? like this way: select->type1.a; select->type2.b; //在访问type1之后,然后立即访问type2,我们可以得到type2的值b吗? //我稍微修改了第一篇文章,因为它在开头是无意义的。 }

如何在C语言中使用Union

我对C语言中的联合有疑问。 在联合中声明的变量将共享相同的内存,好吧,我明白了。 例如, union student { int i; int j; }x; 我们怎么能访问i和j? 如果我们有:xi = 1; 然后我们printf(“%d”,j); 会发生什么? 编译错误? 那么以下情况呢? union student { int i; float j; }x; 如果我们指定xi = 2; xj的价值是多少?

为什么union *和struct *之间可能存在差异?

C标准要求所有指向union的指针具有相同的表示和对齐要求。 它对struct s的所有指针都强制要求。 因此,我的问题: 为什么标准不强制指向union的指针具有与struct s指针相同的表示和对齐要求? (我非常感谢一个利用这个实现的实现的例子。) 或者我只是错过了相关的文字? 标准草案n1570(C11最终草案)的相关引用: 6.2.5类型§28 指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。 48)类似地,指向兼容类型的合格或非限定版本的指针应具有相同的表示和对齐要求。 所有指向结构类型的指针都应具有相同的表示和对齐要求。 所有指向union类型的指针都应具有相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

联合与无效指针

使用简单的void *而不是union的区别是什么? 例: struct my_struct { short datatype; void *data; } struct my_struct { short datatype; union { char* c; int* i; long* l; }; }; 这两个都可以用来完成完全相同的事情,是否更好地使用union或void *虽然?

C克服别名限制(工会?)

假设我有一个示例源文件test.c,我正在编译它: $ gcc -03 -Wall test.c看起来像这样…… /// CMP128(x, y) // // arguments // x – any pointer to an 128-bit int // y – any pointer to an 128-bit int // // returns -1, 0, or 1 if x is less than, equal to, or greater than y // #define CMP128(x, y) // magic goes […]

为什么我的工会没有显示正确的值?

union { int i; bool b; } x; xi = 20000; xb = true; cout << xi; 打印出19969.为什么不打印出20000?

工会内无名的联盟

我正在阅读一些代码,发现如下内容: typedef union { int int32; int boolean; time_t date; char *string; union { struct foo *a; struct foo *b; struct foo *c; }; } type_t; 从语法的角度来看,内部union {}可以被删除,并且* a,* b和* c直接位于外部union {}内。 那么无名嵌入式联盟的目的是什么?

C中的并集的实际用法

可能重复: C:联合实际使用在哪里? 我知道union的概念,但我没有看到真实世界编码的实际情况,我应该使用union数据结构。 如果你们能给我一些示例或教程来展示使用union正确的案例,我将非常感激。 提前致谢。

我们可以将va_arg与工会一起使用吗?

6.7.2.1我的C99标准草案第14段有关于工会和指针的说法(强调,一如既往地增加): 联合的大小足以容纳其中最大的成员。 最多一个成员的值可以随时存储在union对象中。 指向适当转换的并集对象的指针指向其每个成员(或者如果成员是位字段,则指向它所在的单位),反之亦然。 一切都很好,这意味着执行类似下面的操作是合法的,将signed或unsigned int复制到union中,假设我们只想将其复制到相同类型的数据中: union ints { int i; unsigned u; }; int i = 4; union ints is = *(union ints *)&i; int j = is.i; // legal unsigned k = is.u; // not so much 7.15.1.1第2段有这样的说法: va_arg宏扩展为具有指定类型的表达式和调用中下一个参数的值。 参数ap应该由va_start或va_copy宏初始化(没有为va_copy调用va_end宏)。 每次调用va_arg宏都会修改ap以便依次返回连续参数的值。 参数type应该是指定的类型名称,以便可以通过将*到type来获得指向具有指定类型的对象的指针的type 。 如果没有实际的下一个参数, 或者type与实际的下一个参数的类型不兼容(根据默认参数提升而提升),则行为是未定义的,除了以下情况: -one type是有符号整数类型,另一种类型是相应的无符号整数类型,并且该值可在两种类型中表示; -one类型是指向void的指针,另一个是指向字符类型的指针。 我不打算引用关于默认参数促销的部分。 我的问题是:这是定义的行为: void func(int i, […]

如何初始化联盟?

如果它是一个struct那么就可以完成 *p = {var1, var2..}; 但似乎这对union不起作用: union Ptrlist { Ptrlist *next; State *s; }; Ptrlist *l; l = allocate_space(); *l = {NULL}; 只得到: expected expression before ‘{‘ token