问题1:struct与union 有什么作用?两者有什么区别?
struct的小秘密
1、C语言中的struct可以看做变量的集合
struct的问题:空结构体占用多大内存?
struct TS
{
};
sizeof(struct TS) = ?
答案是:0或错误;实际软件开发过程中无意义!
例子:空结构体的大小
#include <stdio.h>
struct TS
{
};
int main()
{
struct TS t1;
struct TS t2;
printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);
return 0;
}
结构体与柔性数组
1、柔性数组即数组大小待定的数组;
2、C语言中可以由结构体产生柔性数组;
3、C语言中结构体的最后一个元素可以是大小未知的数组;
struct SoftArray
{
int len;
int array[];
};
sizeof(struct SoftArray) = ?
答案是4,SoftArray中的array仅是一个待使用的标识符,不占用存储空间。
柔性数组的用法
struct SoftArray
{
int len;
int array[];
};
// ...
struct SoftArray* sa = NULL; //定义一个结构体指针,指向空指针
sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int)*5);
/* 使sa指向一片合法的内存空间,malloc用于在堆中申请内存空间 */
sa->len = 5; //赋值len的值为5,由于上面申请内存,array代表了后面的5个sizeof(int)。
如下图所示,sa指向空间的分布,是先存放SoftArray,由于array不占用存储空间,所以SoftArray存放的是sa->len,占用4个字节,sa->array代表了后面的5个sizeof(int),即一个5个int元素的数组。通过这样一个方式
例子:柔性数组使用分析
#include <stdio.h>
#include <malloc.h>
struct SoftArray
{
int len;
int array[];
};
struct SoftArray* create_soft_array(int size)
{
struct SoftArray* ret = NULL;
if( size > 0 )
{
ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
ret->len = size;
}
return ret;
}
void delete_soft_array(struct SoftArray* sa)
{
free(sa);
}
void func(struct SoftArray* sa)
{
int i = 0;
if( NULL != sa )
{
for(i=0; i<sa->len; i++)
{
sa->array[i] = i + 1;
}
}
}
int main()
{
int i = 0;
struct SoftArray* sa = create_soft_array(10);
func(sa);
for(i=0; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
}
delete_soft_array(sa);
return 0;
}
union
1、C语言中的union在语法上与struct相似;
2、union只分配最大成员的成员,所有成员共享这个空间;
union的注意事项
union的使用受系统大小端的影响
例子:编程判断系统的大小端
#include <stdio.h>
int system_mode()
{
union SM
{
int i;
char c;
};
union SM sm;
sm.i = 1;
return sm.c;
}
int main()
{
printf("System Mode: %d\n", system_mode());
return 0;
}
总结:
1、struct中每个数据成员有独立的存储空间;
2、struct可以通过最后的数组标识符产生柔性数组;
3、union中的所有数据成员共享一个存储空间;
4、union的使用会受到系统大小端的影响;