struct,union分析
2017-06-13 23:13
190 查看
关键字的秘密
专题一:关键字的秘密。包括以下章节:基本数据类型分析
auto,register,static分析
if,switch,do,while,for分析
goto,void,extern,sizeof分析
const,volatile分析
struct,union分析
enum,typedef分析
思考
空结构体占有多大内存?灰色地带:c语言并没有定义空结构体占有多大内存,各个编译器实现也不同。
提示:gcc编译器与g++编译器输出结果不同。通常我们按照g++编译的结果(空结构体占一个字节),更合理。
#include<stdio.h> struct _null { }; int main() { struct _null n1; struct _null n2; printf("%lu\n", sizeof(struct _null)); printf("%lu, %0X\n", sizeof(n1), (unsigned int)(long)&n1); printf("%lu, %0X\n", sizeof(n2), (unsigned int)(long)&n2); return 0; }
打印结果:
由结构体组成的柔性数组
struct softArray { int len; int array[]; }
柔性数组占有多大内存?
#include<stdio.h> typedef struct _soft_array { int len; int array[]; }SoftArray; int main() { //柔性数组占4个字节内存大小(array域不占内存) printf("%lu\n", sizeof(SoftArray)); return 0; }
打印结果:
柔性数组赋值
#include<stdio.h> #include<malloc.h> typedef struct _soft_array { int len;//array中包含元素的个数 int array[]; }SoftArray; int main() { // printf("%lu\n", sizeof(SoftArray)); int i = 0; //第一步:堆中申请4+4*10个空间 SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*10); //第二步:len赋值 sa->len = 10; //第三步:array赋值 for(i=0; i<sa->len;i++) { sa->array[i] = i + 1; } for(i=0; i<sa->len;i++) { printf("%d \n", sa->array[i]); } //第四步:释放空间 free(sa); return 0; }
打印结果:
手把手教你写代码:柔性数组的使用(存储费波拉茨数列)
思维导图#include<stdio.h> #include<malloc.h> typedef struct _soft_array { int len; int array[]; }SoftArray; SoftArray* create_soft_array(int size) { SoftArray* ret = NULL; if(size > 0) { //sizeof(*(ret->array)) //ret->array为数组名,也是整个数组的指针,也是数组第一个元素的指针 //*(ret->array)是第一个元素的值,相当于*p //sizeof(*(ret->array))等价于sizeof(*(&ret->array[0]))等价于sizeof(ret->array[0]) ret = (SoftArray*)malloc(sizeof(SoftArray)+sizeof(*(ret->array))*size); ret->len = size; } return ret; } void fac(SoftArray* sa) { int i = 0; if(sa != NULL) { if(1 == sa->len) { sa->array[0] = 1; } else { //当sa->len == 2时,不执行for循环 sa->array[0] = 1; sa->array[1] = 1; for(i = 2; i < sa->len; i++) { sa->array[i] = sa->array[i-1] + sa->array[i-2]; } } } } void delete_soft_array(SoftArray* sa) { free(sa); } int main() { int i = 0; //第一步:申请堆空间,创建柔性数组(包括sa->len赋值) SoftArray* sa = create_soft_array(10); //第二步:根据算法赋值 fac(sa); for(i = 0; i < sa->len; i++) { printf("%d\n", sa->array[i]); } //第三步:释放堆空间 delete_soft_array(sa); return 0; }
打印结果:
union与struct的区别
struct每个域都会分配空间union只分配最大的域的空间,其他域共享该空间
#include<stdio.h> struct s { int i; char c; }; union u { int i; char c; }; int main() { struct s ss; union u uu; printf("%lu\n", sizeof(ss)); printf("%lu\n", sizeof(uu)); return 0; }
打印结果:
union使用与系统大小端有关
#include<stdio.h> int check() { union check { int i; char c; }; union check c; c.i = 1; //c.c=1,系统为小端模式;c.c=0,系统为大端模式 return c.c; } int main() { printf("%d\n", check()); return 0; }
打印结果:
相关文章推荐
- 【C语言复习(二)】struct 与 union 的分析
- 第10课 struct 和 union 分析
- struct和union分析
- struct , union 关键字分析
- C语言之struct和union分析
- 第10课 - struct 和 union 分析
- sizeof(struct)分析(包括union)
- 10_struct和union分析
- 10 - struct(可变长数组) 和 union 分析
- struct和union分析
- struct和union分析
- [转载] c语言中的结构(struct)和联合(union)简介
- 分析struct net_device转
- union 与 struct 区别
- illegal use of incomplete struct/union/class 'CAknViewAppUi'
- c语言 结构(struct)和 联合(union)
- class struct union 的区别
- Union in C# & struct memory layout
- c语言 结构(struct)和联合(union)简介
- C++中的union 分析