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相关推荐

  1. c语言struct_Introduction to CSAPP(十七):复杂数据组织与C语言的 struct与union

    如果说数组是同一种类型的数据的连续排列的数据组织形式,那么对于不同类型的数据来说,他们被有机组织起来的方式有两种,分别是struct和union. Struct C语言的 struct 创建一种数据类 ...

  2. C语言里struct和union的区别

    struct和union是C语言的两种数据结构,这两种都是常用的复合结构. 区别: (1) 联合体:所有成员共用一块地址空间,也就是说联合体只放了一个被选中的成员: 结构体:所有的成员的内存占用是累加 ...

  3. [C/C++基础知识] 面试再谈struct和union大小问题

    最近找工作参加了很多笔试,其中考察结构体和联合体的大小问题是经常出现的一个问题.虽然题目简单而且分值比较低,但是还是想再给大家回顾下这些C和C++的基础知识.希望文章对你有所帮助~         P ...

  4. struct and union

    [url]http://hi.baidu.com/tweigh/blog/item/5303d2ef6e2720eace1b3e9d.html[/url] 1. struct的巨大作用 面对一个人的大 ...

  5. C++ struct 与 union

    编码运行环境:VS2017+Win32+Debug,Win32表示生成32bits的应用程序. 文章目录 1.struct 2.union 2.1 基本性质 2.2 高级特性 参考文献 结构体(str ...

  6. 深入探索C语言struct的用法

    文章开始之气那,给大家分享一个C语言在线练习的网站(本人常用):C语言在线练习 struct的作用 一般来说,区别一个开发人员是否具备丰富开发经历的标志在于其会不会使用struct,怎么使用strcu ...

  7. C语言学习—联合体Union和关键字Typedef

    C语言学习-联合体Union和关键字Typedef 前言 1 联合体Union 1.1 Union认知 1.2 Union应用 2 关键字typedef 前言 内容主要为联合体Union和关键字Typ ...

  8. C语言丨关键字union的定义和使用

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在&quo ...

  9. C语言关键字之union

    C语言关键字之union 是什么呢 union 在C语言中可以被称为联合体,也有将其称为共用体.它是一种自定义类型,可以使用它来创建变量. 使用格式 union 联合体名称 { 变量 1: 变量 2: ...

最新文章

  1. 进程间基于消息队列的通信_Linux 进程间的通信方式
  2. JVM内存模型:运行时栈帧结构
  3. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
  4. python 如何判断一个数为整数?(判断整数,没有小数)(取余)判断整型 isinstance()
  5. 绝地求生2017.7.27服务器维护,绝地求生大逃杀更新内容 7月27日更新了什么
  6. java循环怎么分析_Java for循环的几种用法分析
  7. [No0000CE]检测非空格字符作为密码的密码强度
  8. 汇编语言王爽第四版(Debug与实验一)
  9. java 同音字_pinyin: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)...
  10. 明翰经验系列之面试篇V1.1(持续更新)
  11. balsamiq mockups 注册
  12. 前端-查询参考资料网站/软件/移动端、jQuery开发插件官网
  13. WebView-WebView状态和加载方式
  14. Oracle创建表,id为自增序列
  15. 如何搭建个人博客网站(Mac)
  16. 程序人生:程序员要修炼的第一本秘诀--哲学
  17. 移通好闹钟源码(校园交互平台微信小程序)
  18. 全球与中国道路检测系统市场深度研究分析报告
  19. Python拾珍:用这些功能写出更简洁、更可读或更高效的代码
  20. 【MySQL】第14章_视图

热门文章

  1. 这十个行业最吃香!我国检验检测行业人才需求旺盛
  2. 无法在此计算机上安装vmware,【解决】虚拟windows7无法安装VMware Tools
  3. 2017年全国大学生电子设计大赛有感
  4. 史上最全采样方法详细解读与代码实现
  5. python爬虫-Day04
  6. 提升Python学习效率的方法
  7. 转载:一个项目经理的个人体会、经验总结
  8. Vmware与Hyper-v不兼容的解决方法
  9. CodeForces 104B-Testing Pants for Sadness(思维题)
  10. can转光纤,can转以太网 LCFNET系列CAN转光纤以太网设备实现CAN网络之间超远距离光纤连通