第10课 struct和union分析

struct的小秘密:空结构体占多大内存呢?

第10课   struct和union分析

直观的答案有两种:

  1、空结构体的大小为0

  2、结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误

实例分析:

 #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 ;
}

gcc编译运行如下所示:

第10课   struct和union分析

用bcc编译器对上述程序进行编译,结果如下:

第10课   struct和union分析

bcc不允许定义空结构体。

用vc编译器编译结果如下:

第10课   struct和union分析

vc编译器也不允许定义空结构体。

结构体与柔性数组:

第10课   struct和union分析

在C语言中,结构体的最后一个元素可以定义成int array[]的形式。大小待定的数组即为柔性数组。

示例:

第10课   struct和union分析

柔性数组的用法:

第10课   struct和union分析

SoftArray的成员只有len。array[]只是一个标识,实际使用时代表的是len之后的动态申请的空间。

示例:

 #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 > )
{
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 = ; if( NULL != sa )
{
for(i=; i<sa->len; i++)
{
sa->array[i] = i + ;
}
}
} int main()
{
int i = ;
struct SoftArray* sa = create_soft_array(); func(sa); for(i=; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
} delete_soft_array(sa); return ;
}

运行结果如下:

第10课   struct和union分析

  柔性数组的好处在于,我们的func函数只需要一个指向柔性数组的指针就好了,而不需要数组大小的参数。也不用在定义数组的时候就预先指定数组的大小。这样既方便又好用。

C语言中的union:

第10课   struct和union分析

union的注意事项:

第10课   struct和union分析

判断系统的大小端:

 #include <stdio.h>

 int system_mode()
{
union SM
{
int i;
char c;
}; union SM sm; sm.i = ; return sm.c;
} int main()
{
printf("System Mode: %d\n", system_mode());
return ;
}

运行结果如下:

第10课   struct和union分析

可见当前运行在小端模式系统。

在使用联合体时一定要注意大小端。

小结:

  struct中的每个数据成员有独立的存储空间

  struct可以通过最后的数组标识符产生柔性数组,柔性数组的好处在于可以在程序运行阶段得到一个数组,并且带长度信息

  union中的所有成员共享同一个存储空间

  union的使用会受到系统大小端的影响

上一篇:Spring Boot干货系列:(六)静态资源和拦截器处理


下一篇:HDU 1019 Least Common Multiple 数学题解