工程设计东莞网站建设技术支持,wordpress+打断点,网站建设类公司新闻,搜狗搜索太原运营中心怎么样本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小
C语言中的struct可以看成是变量的集合
如果一个struct里面什么都没有#… 本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结 1 空struct的大小
C语言中的struct可以看成是变量的集合
如果一个struct里面什么都没有是空的那么它的大小是多少呢?(不考虑C语言的特性) 实际上这在不同的编译器中还是不一样的。比如下面的代码
#include stdio.hstruct 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 0;
}使用gcc 4.4.5 编译运行结果如下 使用vs 2017编译运行会报错 所以这个问题其实没有什么意义在我看来。
2 结构体与柔性数组 我们都知道C语言中的数组都是固定大小的。一开始定义数组的时候就需要确定数组的大小。这样其实很不友好如果确定数组大小后后面大小又不够就需要给数组重新分配内存空间这样会带来比较大的开销。柔性数组可以解决这个问题。 柔性数组是一种数组大小待定的数组在C语言中可以使用结构体产生柔性数组C语言中结构体的最后一个元素可以是大小未知的数组。 其中SoftArray 中的array仅仅是一个待使用的标识符不占用存储空间。所以sizeof(struct SoftArray) 4 2.1 柔性数组的使用方法
下图是定义柔性数组并在需要的时候为柔性数组分配合适的内存空间的代码示例
上述代码完成后将得到如下图所示的柔性数组 在上图的柔性数组中第一个元素存的是柔性数组的长度即5 。 后面的5个元素就是柔性数组的内容。 2.2 柔性数组使用代码案例分析
下面的代码是创建柔性数组并初始化然后打印的C语言代码
#include stdio.h
#include malloc.hstruct SoftArray{int len;int array[];
};struct SoftArray* Creat_Soft_Array(int size){struct SoftArray* ret NULL;if(size 0){ret (struct SoftArray*)malloc(sizeof(int) size * sizeof(int));ret-len size;}return ret;
}void delete_soft_array(struct SoftArray* sa){free(sa);
}void Init_SoftArray(struct SoftArray* sa){int i 0;if(NULL ! sa){for(i 0; isa-len ; i){sa-array[i] i1;}}
}int main(){int i 0;struct SoftArray* sa Creat_Soft_Array(5);Init_SoftArray(sa);for(i 0; isa-len; i){printf(%d\n, sa-array[i]);}delete_soft_array(sa);return 0;
}运行结果如下
3 C语言中的union分析
C语言中的union在语法上与struct类似与struct不同的是union值分配最大成员的空间其他成员共享这个空间。某一时刻只有一个成员是存在的。 3.1 使用union判断系统大小端 union的使用受系统大小端的影响。系统大小端如果不懂请自行google搜索 如下图 如下代码如果打印的是1就是小端如归打印的是0就是大端
#include stdio.hint system_mode()
{union SM{int i;char c;};union SM sm;sm.i 1;return sm.c;
}int main()
{printf(System Mode: %d\n, system_mode());return 0;
}在我的虚拟机Ubuntu上运行结果是1小端模式。
4 总结
struct 结构体中的每个数据成员都有独立的存储空间struct 可以通过最后的数组标识符产生柔性数组union中所有数据成员共享同一个存储空间union的使用会受系统大小端的影响