struct的小秘密:

  • C语言中的struct可以看作变量的集合
  • struct的问题:空结构体占用多大内存呢?

程序实例1:

  1. #include <stdio.h>
  2.  
  3. struct TS
  4. {
  5.  
  6. };
  7.  
  8. int main()
  9. {
  10. struct TS t1;
  11. struct TS t2;
  12.  
  13. printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
  14. printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
  15. printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);
  16.  
  17. return ;
  18. }

对于空结构体这个概念不同的编译器可能做出的选择不一样:

  • 像gcc,codeblocks,vs这种编译器可以接受空结构体,不会报错
  • 像vc和bcc编译器就不能接受空结构体这种概念
  • 对于空结构体这个概念,是一个灰色地带,不存在哪种编译器做出的选择更加正确

结构体与柔数组:

  • 柔性数组即数组大小待定的数组
  • C语言可以由结构体产生柔性数组
  • C语言结构体中的最后一个元素可以是大小未知的数组

程序示例2:

  1. struct SoftArray
  2. {
  3. int len;
  4. int array[];
  5. };

那么就有一个问题了,sizeof(struct SoftArray);的大小是多少呢?SoftArray 中的array仅是一个待定使用的标识符,不占用存贮空间

程序示例3:(柔性数组的用法)

  1. struct SoftArray
  2. {
  3. int len;
  4. int array[];
  5. };
  6. //......
  7. struct SoftArray sa;
  8. sa =(struct SoftArray *)malloc(sizeof(struct SoftArray)+sizeof(int)*);
  9.  
  10. sa->len=;

这只是一个代码片段,定义了一个int类型的柔性数组,长度为5

程序示例4:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. struct SoftArray
  5. {
  6. int len;
  7. int array[];
  8. };
  9.  
  10. struct SoftArray* create_soft_array(int size)
  11. {
  12. struct SoftArray* ret = NULL;
  13.  
  14. if( size > )
  15. {
  16. ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
  17.  
  18. ret->len = size;
  19. }
  20.  
  21. return ret;
  22. }
  23.  
  24. void delete_soft_array(struct SoftArray* sa)
  25. {
  26. free(sa);
  27. }
  28.  
  29. void func(struct SoftArray* sa)
  30. {
  31. int i = ;
  32.  
  33. if( NULL != sa )
  34. {
  35. for(i=; i<sa->len; i++)
  36. {
  37. sa->array[i] = i + ;
  38. }
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. int i = ;
  45. struct SoftArray* sa = create_soft_array();
  46.  
  47. func(sa);
  48.  
  49. for(i=; i<sa->len; i++)
  50. {
  51. printf("%d\n", sa->array[i]);
  52. }
  53.  
  54. delete_soft_array(sa);
  55.  
  56. return ;
  57. }

定义了一个柔性数组,并且给它赋值,然后将值打印出来,大佬们自己看一下,我相信你们用眼睛瞟一下就懂了,嘻嘻。

C语言中的union:

  • C语言中的union在语法上和struct相似
  • union只分配最大成员的空间,所有成员共享这个空间

union的注意事项:union的使用受系统大小端的影响,大小端是什么意思呢,我就用一段代码给大家介绍一下

程序示例5:

  1. union C
  2. {
  3. int i;
  4. char c;
  5. };
  6.  
  7. union C c;
  8. c.i=;
  9. printf("%d\n",c.c); //?

这段代码片段会打印什么呢,需要和我们的系统来决定:

小端模式:会从低地址到高地址来存贮这个1,也就是我们平常习惯的方式,因为打印的时候就是从低地址读取到高地址,,所以会打印出来1

大端模式:会从高地址到低地址来存贮这个1,也就是说这个1存贮在高位,由于打印的时候是从低位读取打印,所以会打印0

注意:这段代码其实很巧妙,我们给c里面的i(int类型  四个字节),然后打印c里面的的c(char类型),大家自己好好体会一下

程序示例6:(判断自己的系统是哪种模式)

  1. #include <stdio.h>
  2.  
  3. int system_mode()
  4. {
  5. union SM
  6. {
  7. int i;
  8. char c;
  9. };
  10.  
  11. union SM sm;
  12.  
  13. sm.i = ;
  14.  
  15. return sm.c;
  16. }
  17.  
  18. int main()
  19. {
  20. printf("System Mode: %d\n", system_mode());
  21. return ;
  22. }

如果输出为1,那么就是小端模式,如果输出为0,那么就是大端模式

小结:

  • struct中的每个数据成员具有独立的存贮空间
  • struct可以通过最后的数组标识符产生柔性数组
  • union中的所有数据成员共享一个存贮空间
  • union的使用会受到系统大小端的影响

C语言进阶——struct和union分析10的更多相关文章

  1. 第10课 struct 和 union 分析

    1. struct的小秘密 (1)C语言中的struct可以看作变量的集合 (2)struct的问题——空结构体占用多的内存? [实例分析]空结构体的大小 #include <stdio.h&g ...

  2. 第10课 struct和union分析

    struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...

  3. C语言进阶——enum, sizeof, typedef 分析11

    枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只 ...

  4. struct和union分析实例

    1.#include <stdio.h>#include <malloc.h>typedef struct _soft_array{    int len;    int ar ...

  5. C语言进阶——const 和 volatile 分析09

    const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 ...

  6. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  7. 关于C中struct和union长度的详解

    这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今 ...

  8. struct和union

    struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...

  9. (C语言)共用体union的使用方法举例

    曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...

随机推荐

  1. 非关系型数据库(NOSQL)-Redis

    整理一波Redis 简介,与memcached比较 官网:http://redis.io Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  2. better-scroll 遇到的问题 2

    问题的描述: 在歌曲列表页面使用了scroll插件,搜索了很多歌曲,页面出现滚动,选择播放一首歌曲,弹出播放器,将播放器最小化,页面回到歌曲列表,并且页面的底部出播放歌曲的信息(在没有播放歌曲的时候是 ...

  3. (六)JavaScript之[Regular Expression]与[错误(try, catch, throw)]

    10].正则表达式 /** * 正则表达式(Regular Expression): * * 用于文本搜索和文本替换 * */ /** * /good/i是一个正则表达式. * good是一个模式(用 ...

  4. Osclass-3.6.1 (Openlogic CentOS 7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: osclass3.6.1 cms commercial content management ecommerce open-source 服务优惠价 ...

  5. git 因线上分支名重复导致无法拉取代码

    有时 git pull 或 git fetch 时发现 git 报了个异常,说法像是无法将线上某个分支与本地分支合并,由于分支是...(很长的hash)但是分支却是...(很长的hash) 仔细查查后 ...

  6. org.springframework.beans.MethodInvocationException: Property 'cacheManager' threw exception; nested exception is org.apache.shiro.cache.CacheException: net.sf.ehcache.CacheException: Caches cannot be

    shiro cache manage配置报错: org.springframework.beans.MethodInvocationException: Property 'cacheManager' ...

  7. phpstorm 2017.1 激活

    打开网址 http://idea.lanyus.com/ 选择获取注册码,复制生成的验证码 安装完成后,打开软件,依次选择菜单栏 Help -> Register-> Activation ...

  8. TP5.1:依赖注入、绑定一个类到容器里、绑定一个闭包到容器中

    依赖注入 1.在application中创建一个文件夹,名字为commom,commom文件夹中创建被注入文件夹,在被注入文件夹中创建一个名为demo.php的文件 2.在demo.php中输入: 3 ...

  9. Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.错误

    错误如图示: 1.在php的目录下建立个文件夹tmp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的.2.在php.ini找到session.save_pa ...

  10. POJ-1840 Eqs---二分

    题目链接: https://vjudge.net/problem/POJ-1840 题目大意: 给出一个5元3次方程,输入其5个系数,求它的解的个数 其中系数 ai∈[-50,50]  自变量xi∈[ ...