联合体的特性之一就是成员共用内存,以最大成员的大小开辟空间。
在一些情况下,这个特性也是在其他编程技巧中出现的,比如数据类型的强制转换,
int t;
char c=(char)t;
不管数据类型怎么转换,都表示同一段代码在同一段内存,这个和联合体是相似的,比如在一个例子中,要解决浮点数的正负判断,一般可能就是直接利用if语句使浮点数和0进行比较,但是这是有风险的,记得之前有个问题如下
#include<stdio.h>
int main()
{
int a = -6;
unsigned int b = 4;
if((a+(int)b) > 0)
printf("a+b>0\n");
else
printf("a+b<0\n");
int z = a+b;
printf("z= %d\n",z);
if(z > 0)
printf("z>0");
else
printf("z<0");
}
对不不同类型的数据尽量不要去加减比较,为了避免这个问题,我们可以使用联合体解决一些问题。还是判断浮点数的正负问题,
typedef union compare{
float f;
int i;
}comp;
给出这样一个联合体定义这样就不存在人为的进行类型转换了。如下为测试代码:
#include<stdio.h>
#include<stdlib.h>
typedef union compare{
float f;
int i;
}comp;
int main()
{
comp c;
float f;
scanf("%f",&f);
c.f=f;
if((c.i&0x80000000))
printf("negtive\n");
else
printf("positive\n");
return 0;
}
结果为:
1.2 positive
-1.2 negtive
联合体在linux2.6内核中也有目前看到的一个用途----进程内存栈
union thread_union
{
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
struct thread_info {
struct task_struct *task; /* main task structure */
struct exec_domain *exec_domain; /* execution domain */
unsigned long flags; /* low level flags */
unsigned long status; /* thread-synchronous flags */
... ..
}
这样做的目的,目前理解为对栈的大小可控,因为THREAD_SIZE是可改变的,在编译内核时。