1、结构体:
1.1、思考题:空结构体占用多大内存空间?
ANS:不同的编译器,这个结果是不定的。在GCC下,空结构体占用0个字节的空间。在G++编译器下,空结构体占用1个字节的空间。
1.2、一个新的概念----柔性数组
柔性数组:数组大小待定的数组。
C语言中结构体的最后一个元素可以为一个大小未知的数组。于是可以利用该特性来产生柔性数组:
struct _soft_array
{
int len;
int array[];
};
此处有一个问题是需要注意的:sizeof(_soft_array) = 4;在柔性数组结构体的声明中“int array[]”只相当于一个占位符,编译器并不会为其分配空间。
柔性数组的使用实例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct _soft_array 5 { 6 int len; 7 int array[]; 8 }SoftArray; 9 10 void main() 11 { 12 unsigned int i=0; 13 SoftArray *sa = (SoftArray *)malloc(sizeof(SoftArray)+sizeof(int)*10); 14 sa->len = 10; 15 16 for(i=0;i<sa->len;i++) 17 { 18 sa->array[i] = i+1; 19 } 20 21 for(i=0;i<sa->len;i++) 22 { 23 printf("%d ",sa->array[i]); 24 } 25 free(sa); 26 getchar(); 27 }
在上述代码中我们首先定义了一个柔性数组的结构体类型,然后我们利用该类型创建了一个柔性数组结构体,我们在堆中为该柔性数组申请了内存空间。这里我们假设我们柔性数组的长度为10.所以我们申请空间的代码如下:
(SoftArray *)malloc(sizeof(SoftArray)+sizeof(int)*10);
数据在内存中存放的示意图如下:
还要注意一点:由于我们是在堆中申请的内存空间,所以当我们使用结束之后,我们需要将空间释放。
2、union关键字:
2.1、struct和union的区别:struct中的每个域在内存中都独立分配空间,而union只分配最大域的空间,所有域都共享这个空间。
2.2、union 的使用受系统大小端的影响:
大端模式:
小端模式:
所以可以利用该特性来写一小代码来检查当前系统是大端模式还是小端模式:
#include<stdio.h> #include<stdlib.h> int check_sys() { union { int i; char c; }dat; dat.i=1; return dat.c==1; } void main() { printf("%d ",check_sys()); getchar(); }
如果系统是小端模式的话,输出结果应该是为1,假如是为大端模式的话,输出结果应该为0。