C语言进阶学习之struct与union分析
程序员文章站
2022-04-30 09:50:05
大家好,今天来看看c语言中的struct与union,我们都知道,c语言中的struct可以看作变量的集合。那么首先来抛出一个问题:空结构体所占的内存空间为多大?
答案是不同的编译器结果不同,在gc...
大家好,今天来看看c语言中的struct与union,我们都知道,c语言中的struct可以看作变量的集合。那么首先来抛出一个问题:空结构体所占的内存空间为多大?
答案是不同的编译器结果不同,在gcc中,空结构体占0个字节;而在vs2010中直接编译不过。
结构体与柔性数组
-柔性数组即数组的大小待定的数组
-c语言中可以由结构体产生柔性数组
-c语言中结构体的最后一个元素可以是大小未知的数组
struct softarray { int len; int array[]; } sizeof(struct softarray) = //该语句输出多少?
注意:softarray中的array仅仅是一个待使用的标识符,不占用存储空间!
那么我们该怎么去使用柔性数组呢?请看下图:
下边来看个具体的代码
#include #include 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; ilen; i++) { sa->array[i] = i + 1; } } } int main() { int i = 0; struct softarray* sa = create_soft_array(10);//创建柔性数组 func(sa);//给柔性数组赋值 for(i=0; ilen; i++) { printf("%d ", sa->array[i]); } printf("\n"); delete_soft_array(sa);//销毁柔性数组 return 0; }
输出如下:
说完了struct,现在来说说union,union中只分配最大成员的空间,所有成员共享这个空间。
同时比较重要的一点是,union的使用受大小端的影响
请思考下边这段代码:
union c { int i; char c; }; union c c; c.i = 1; printf("%d\n", c.c); //输出多少?
我的电脑上vs2010输出如下:(说明我的系统为小端模式,如果在大端模式的系统中,则输出0)
总结:
1、struct中的每个数据成员都有独立的存储空间
2、struct可以通过最后的数组标识符产生柔性数组
3、union成员共享同一个存储空间,空间大小与最大成员所占空间大小一致
4、union的使用会受到系统大小端的影响