C语言struct和union
1.讨论struct
C语言中的struct可以看作变量的集合
struct的问题:空结构体占用多大内存?
编程可知
在GCC编译器中,空结构体占用的大小大小为0,不占用任何内存。
在BCC编译器中,不允许空结构体存在,会报错。
VC10.0也报错,要求结构体至少有一个成员变量。
但是在实际运用中我们也不会去定义一个空结构体,我们简单了解一下即可。
2.结构体与柔性数组
- 柔性数组即数组大小待定的数组
- C语言中可以由结构体产生柔性数组
- C语言中结构体的最后一个元素可以是大小未知的数组
我们看下面例子
#include <stdio.h>
struct SoftArray
{int len;int array[];//柔性数组
};int main()
{printf("%d\r\n",sizeof(struct SoftArray));return 0;
}
运行输出的结果为4。说明了:
SoftArray中的array仅是一个待使用的标识符,不占用存储空间。
虽然没有在结构体中定义柔性数组的内存大小,但是我们可以使用malloc函数来申请所需要的空间。
下面来实例分析一下
#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 > 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; i<sa->len; i++){sa->array[i] = i + 1;//打印柔性数组的值,从1开始}}
}int main()
{int i = 0;struct SoftArray* sa = create_soft_array(10);//创建一个柔性数组,数组大小为10func(sa);//将这个柔性数组传进函数for(i=0; i<sa->len; i++){printf("%d\n", sa->array[i]);}delete_soft_array(sa);//运行结束,销毁数组return 0;
}
这样定义的柔性 数组有什么好处呢?
好处在于func函数只需要传进去一个,指向柔性数组的合法的指针就可以了,我们不用在结构体内固定定好数组的大小,可以根据我们的需要来申请,灵活性高。
3.C语言中的联合体union
- C语言中的union 在语法上与struct相似(除了下面一点不一样)
- union只分配最大成员的空间,所有成员共享这个空间
union的注意事项:
- union的使用受系统大小端的影响
tips:
小端模式,低地址存低位数据
大端模式,低地址存高位数据
来看一个例子
#include <stdio.h>
union C
{int i;char c;
};
int main()
{union C c;c.i = 1;printf("c.c==%d\r\n",c.c);printf("c.i==%d\r\n",c.i);
}
- 觉得输出多少呢?
我在gcc下面输出的是1和1,可知是小端系统。
大端模式下应该输出0。从上面这个例子中我们应该知道,不管系统的大小端是怎样子的,这里的c始终从内存的低地址中取数据。
得知了上面这个知识,我们到底能够干什么呢?
根据上面的特性,编程来判断系统的大小端。
#include <stdio.h>int system_mode()
{union SM{int i;char c;};union SM sm;sm.i = 1;return sm.c;}int main()
{int ret;ret = system_mode();if(1==ret){printf("这是一个小端系统\r\n");}else {printf("这是一个大端系统\r\n");}
}
在gcc编译器下的结果:
4.小结
- struct中的每个数据成员有独立的存储空间
- struct可以通过最后的数组标识符产生柔性数组
- union 中的所有数据成员共享同一个存储空间
- union的使用会受到系统大小端的影响
C语言struct和union相关推荐
- c语言struct_Introduction to CSAPP(十七):复杂数据组织与C语言的 struct与union
如果说数组是同一种类型的数据的连续排列的数据组织形式,那么对于不同类型的数据来说,他们被有机组织起来的方式有两种,分别是struct和union. Struct C语言的 struct 创建一种数据类 ...
- C语言里struct和union的区别
struct和union是C语言的两种数据结构,这两种都是常用的复合结构. 区别: (1) 联合体:所有成员共用一块地址空间,也就是说联合体只放了一个被选中的成员: 结构体:所有的成员的内存占用是累加 ...
- [C/C++基础知识] 面试再谈struct和union大小问题
最近找工作参加了很多笔试,其中考察结构体和联合体的大小问题是经常出现的一个问题.虽然题目简单而且分值比较低,但是还是想再给大家回顾下这些C和C++的基础知识.希望文章对你有所帮助~ P ...
- struct and union
[url]http://hi.baidu.com/tweigh/blog/item/5303d2ef6e2720eace1b3e9d.html[/url] 1. struct的巨大作用 面对一个人的大 ...
- C++ struct 与 union
编码运行环境:VS2017+Win32+Debug,Win32表示生成32bits的应用程序. 文章目录 1.struct 2.union 2.1 基本性质 2.2 高级特性 参考文献 结构体(str ...
- 深入探索C语言struct的用法
文章开始之气那,给大家分享一个C语言在线练习的网站(本人常用):C语言在线练习 struct的作用 一般来说,区别一个开发人员是否具备丰富开发经历的标志在于其会不会使用struct,怎么使用strcu ...
- C语言学习—联合体Union和关键字Typedef
C语言学习-联合体Union和关键字Typedef 前言 1 联合体Union 1.1 Union认知 1.2 Union应用 2 关键字typedef 前言 内容主要为联合体Union和关键字Typ ...
- C语言丨关键字union的定义和使用
union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在&quo ...
- C语言关键字之union
C语言关键字之union 是什么呢 union 在C语言中可以被称为联合体,也有将其称为共用体.它是一种自定义类型,可以使用它来创建变量. 使用格式 union 联合体名称 { 变量 1: 变量 2: ...
最新文章
- 进程间基于消息队列的通信_Linux 进程间的通信方式
- JVM内存模型:运行时栈帧结构
- C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
- python 如何判断一个数为整数?(判断整数,没有小数)(取余)判断整型 isinstance()
- 绝地求生2017.7.27服务器维护,绝地求生大逃杀更新内容 7月27日更新了什么
- java循环怎么分析_Java for循环的几种用法分析
- [No0000CE]检测非空格字符作为密码的密码强度
- 汇编语言王爽第四版(Debug与实验一)
- java 同音字_pinyin: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)...
- 明翰经验系列之面试篇V1.1(持续更新)
- balsamiq mockups 注册
- 前端-查询参考资料网站/软件/移动端、jQuery开发插件官网
- WebView-WebView状态和加载方式
- Oracle创建表,id为自增序列
- 如何搭建个人博客网站(Mac)
- 程序人生:程序员要修炼的第一本秘诀--哲学
- 移通好闹钟源码(校园交互平台微信小程序)
- 全球与中国道路检测系统市场深度研究分析报告
- Python拾珍:用这些功能写出更简洁、更可读或更高效的代码
- 【MySQL】第14章_视图