struct的小秘密:空结构体占多大内存呢?
直观的答案有两种:
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编译运行如下所示:
用bcc编译器对上述程序进行编译,结果如下:
bcc不允许定义空结构体。
用vc编译器编译结果如下:
vc编译器也不允许定义空结构体。
结构体与柔性数组:
在C语言中,结构体的最后一个元素可以定义成int array[]的形式。大小待定的数组即为柔性数组。
示例:
柔性数组的用法:
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 ;
}
运行结果如下:
柔性数组的好处在于,我们的func函数只需要一个指向柔性数组的指针就好了,而不需要数组大小的参数。也不用在定义数组的时候就预先指定数组的大小。这样既方便又好用。
C语言中的union:
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 ;
}
运行结果如下:
可见当前运行在小端模式系统。
在使用联合体时一定要注意大小端。
小结:
struct中的每个数据成员有独立的存储空间
struct可以通过最后的数组标识符产生柔性数组,柔性数组的好处在于可以在程序运行阶段得到一个数组,并且带长度信息
union中的所有成员共享同一个存储空间
union的使用会受到系统大小端的影响