如果没有原因?工会在结构上的用途?我们可以在联合中使用指针吗?
11
A
回答
11
您可以在联合中使用任何数据类型,没有限制。关于联合在结构上的使用,结构在存储器中顺序地布置它们的数据。这意味着所有的子组件都是分开的。
另一方面,工会对其所有子部件使用相同的内存,因此一次只能存在一个。
例如:
+-----+-----+
struct { int a; float b } gives | a | b |
+-----+-----+
^ ^
| |
memory location: 150 154
|
V
+-----+
union { int a; float b } gives | a |
| b |
+-----+
结构所使用的地方的“对象”是由其它的目的,如由两个整数,它们是x和y的点对象的坐标:
typedef struct {
int x; // x and y are separate
int y;
} tPoint;
工会通常用于以下情况:对象可以是许多事物中的一种,但一次只能有一种,例如无类型存储系统:
typedef enum { STR, INT } tType;
typedef struct {
tType typ; // typ is separate.
union {
int ival; // ival and sval occupy same memory.
char *sval;
}
} tVal;
它们对于节约内存非常有用,尽管现在这种情况往往越来越少(除了像嵌入式系统这样的低级工作以外),所以你没有看到太多内容。
4
那么,根据ISO/IEC 9899:TC3(C99标准):
甲联合类型描述了一种重叠的非空集成员的对象,每个 ,其具有任选的指定名称和可能不同的类型。
简而言之,联合成员的内存空间重叠,并且您给联合成员的名称允许您在该位置读取内存大小。考虑:
#include <stdio.h>
#include <stdint.h>
typedef union
{
struct
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
};
uint32_t x;
} somenewtype;
typedef union
{
uint32_t* p;
uint8_t* q;
} somepointer;
int main(int argc, char** argv)
{
uint32_t r;
uint8_t s;
somenewtype z;
somepointer p;
r = 0x11223344; s = 0x11;
z.x = 0x11223344;
p.p = &r;
p.q = &s;
printf("%x%x%x%x\n", z.d, z.c, z.b, z.a);
printf("%x %x\n", *(p.p), *(p.q));
}
在第一个printf中,我们正在做的是打印32位整数的8位部分。当然希望在那个匿名结构中没有填充。
在第二个printf?我不得不介入,通过使用gdb的理解,但我所做的:
p.p = (uint32_t *) 0x7fffffffde5c;
p.q = (uint8_t *) 0x7fffffffde5b "\021D3\"\021P\337\377\377\377\177";
p.p = (uint32_t *) 0x7fffffffde5b;
当然好了,指针都一样大小,因此分配p.q
覆盖的p.p
地址。我强烈地怀疑,将32位整数的地址解除引用到8位指针时,会打印出“该位置处的任何内容+ 32位大小”,这对我来说恰好是22334411
。但我怀疑,在那个时候,行为是不确定的。
无论如何,这一点练习的要点是你表明:
- 工会可以通过使用不同的“类型”修改器来访问相同的存储位置。
- 你必须小心你所做的事,并理解你所使用的基础类型。如果您要使用指针,请注意他们的修改,因为您可能会开始指向谁知道什么。
我要指出,我可以看到实际使用的somenewtype
而不是somepointer
- 这是一个人为的例子,我敢肯定将打破。
相关问题
- 1. const和普通指针的指针可以混合使用吗?
- 2. 我们可以使用“this”指针获取对象名称吗
- 3. 我们可以使用API创建Amazon联合身份池吗?
- 4. 我们可以使用多个联合减速器吗?
- 5. 如何在联合中使用指针
- 6. 我们可以说指针值指定了一个对象吗?
- 7. 使用指针和联合
- 8. 指针,我正确使用它们吗? Objective-C的/可可
- 9. 我们可以访问C#中的指针吗?
- 10. 我可以使用指针在Fortran中创建子数组吗?
- 11. 我们需要指针吗?
- 12. 在memcmp我们可以使用数组而不是指针
- 13. 通过函数指针使用的函数可以内联吗?
- 14. 可以在printf中使用指向字符串的指针吗?
- 15. 我们可以在我们的matlab程序中使用“点”吗?
- 16. 在这种情况下,我可以重新使用指针吗?
- 17. 我可以在指针副本上使用const_cast吗?
- 18. 我们可以使用out指针对象访问托管代码吗?
- 19. 我可以投这样的指针吗?
- 20. 我们可以使用内部构造this指针
- 21. 我可以使用' - >'操作符通过指针访问对象指针吗?
- 22. 我们可以在类声明中声明类的类型指针吗?
- 23. 我可以使用malloc来引用而不是指针吗?
- 24. 我们可以整合声纳吗?
- 25. 我们可以结合git标签吗?
- 26. 我们可以整合Dynamodb和Wavemaker吗?
- 27. 我们可以用平板电脑使用c指纹吗#
- 28. 我们可以结合Angular指令和工厂的代码吗?
- 29. 我们在哪里可以使用C中的函数指针,函数指针有什么用处
- 30. 我们可以在systemtap探针中执行systemcall吗?
工会不是为了节省内存:它们表达* sum类型*,即。一种持有例如。 * * float *或* int。工会很难使用,而且相当有限。请考虑使用`boost :: variant`来代替。 – 2011-01-20 15:09:08