1. struct的小秘密

(1)C语言中的struct可以看作变量的集合

(2)struct的问题——空结构体占用多的内存?

【实例分析】空结构体的大小

#include <stdio.h>

struct TS
{ }; int main()
{
struct TS t1;
struct TS t2; //VC、BCC下定义空结构体编译器直接报错,gcc下空结构体大小为0
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 ;
}

2. 结构体与柔性数组

(1)柔性数组即数组大小待定的数组

(2)C语言中可以由结构体产生柔性数组

(3)C语言中结构体的最后一个元素可以是大小未知的数组

struct SoftArray
{
  int len;
  int array[]; //array仅是一个待使用的标识符。与指针不同,编译器
  //并不为array变量分配空间,因为也不知道array究竟
  //多大。只是用来作为一个标识符,以便以后可以通过这
  //个标识符来访问其中的内容。所以sizeof(SoftArray)=4
}

(4)柔性数组的用法

 struct SoftArray* sa = NULL;
//注意,因sizeof柔性数组并不包含array大小,所以要开辟的空间总大小应等于
//柔性数组+数组各元素所占的空间,即空间大小等于结构体的大小(len域)加上数组的大小
sa = (struct SoftArray*)malloc(sizeof(struct SoftArray)+sizoef(int)*);
sa->len = ;

【实例分析】柔性数组使用分析

#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 > )
{
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 = ; if( NULL != sa )
{
for(i=; i<sa->len; i++)
{
sa->array[i] = i + ;
}
}
} int main()
{
int i = ;
struct SoftArray* sa = create_soft_array(); func(sa); for(i=; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
} delete_soft_array(sa); return ;
}

3. C语言中的union

(1)C语言中的union在语法上与struct相似

(2)union只分配最大成员的空间,所有成员共享这个空间

(3)union的使用受系统大小端的影响

【编程实验】判断系统的大小端

#include <stdio.h>

int system_mode()
{
union SM
{
int i;
char c;
}; union SM sm; sm.i = ; return sm.c;
} int main()
{
//返回1时为小端,0为大端模式
printf("System Mode: %d\n", system_mode());
return ;
}

4. 小结

(1)struct中的每人数据成员有独立的存储空间

(2)struct可以通过最后的数组标识符产生柔性数组

(3)union中的所有数据成员共享同一个存储空间

(4)union的使用会受到系统大小端的影响

第10课 struct 和 union 分析的更多相关文章

  1. 第10课 struct和union分析

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

  2. C语言进阶——struct和union分析10

    struct的小秘密: C语言中的struct可以看作变量的集合 struct的问题:空结构体占用多大内存呢? 程序实例1: #include <stdio.h> struct TS { ...

  3. struct和union分析实例

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

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

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

  5. struct和union

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

  6. 第11课 - enum, sizeof, typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

  7. 关于 typedef & typedef struct & typedef union理解 --写给不长脑子的我

    来源: http://zhidao.baidu.com/link?url=qxzkx5gaoCfnHnygYdzaLEWkC45JqNYYUk42eHHjB0yB3ZMgHv6lGjnq3CRfgQw ...

  8. 【集美大学1411_助教博客】团队作业10——项目复审与事后分析(Beta版本)

    写在前面的话 软件工程课结束了,大家开心吗?是不是再也不用熬夜写代码了?如果这门课你真的熬夜写代码了,相信你一定有收获,如果这门课结束了你觉得是自己一个全新的开始,那么这门课的意义就实现了.团队作业全 ...

  9. <转> Struct 和 Union区别 以及 对内存对齐方式的说明

    转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...

随机推荐

  1. 转:ios导航栏设置

    原帖:http://www.cocoachina.com/industry/20131104/7287.html 本文提供的代码需要用Xcode 5来执行.如果你还在使用老版本的Xcode,那么在运行 ...

  2. Influxdb简单实用操作

    新的infludb版本已经取消了页面的访问方式,只能使用客户端来查看数据 一.influxdb与传统数据库的比较 库.表等比较: influxDB 传统数据库中的概念 database 数据库 mea ...

  3. videojs 隐藏videobar

    video::-internal-media-controls-download-button { display: none; } video::-webkit-media-controls-enc ...

  4. 【计算机视觉】人脸检测模型的评估方法-linux

    前言 人脸检测标准库FDDB详细介绍了数据库和使用方法.对于训练的模型,如何评估模型的效果呢,本文对此进行介绍.说实话,参考了很多博客,但是感觉都不是很明白(当然本文也会有瑕疵),故在此记录! 测试环 ...

  5. opencv2.4.10与VS2013的环境配置

    前言 项目几乎都是图像相关的,一般都会用到opencv开源库,就涉及到windows下opencv的环境配置问题,本文对此进行介绍. 环境 系统环境:win10_x64(其他windows系统类似); ...

  6. 取消word中所有超链接

    我用的是M-O-W2007,最近做了一个文档,里面很多网上拷下来的图片,很多都有超链接,不想一个一个的取消,请高手帮忙教下有没有措施一次性都取消? 最佳答案: 三种方法,任意选用其中之一: 第一种方法 ...

  7. shell 命令学习

    https://blog.csdn.net/mnmlist/article/details/55215158

  8. Struts2重新学习2之struts2和struts1的区别

    1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Struts 2 Action类可以实现一个Acti ...

  9. WPF优化体验<一>(转)

    最近将一个开发和维护了五年的一个Winform项目进行重构,考虑到最近很流行将用户体验挂在嘴上,于是采用了WPF技术,希望能在外观和体验上有一个全新的效果. 以前使用Winform的时候内存控制得不错 ...

  10. GStreamer插件分类

    gst-plugins-base一套小而固定的插件,涵盖各种可能类型的elements; 这些在开发系列期间随着核心变化而不断更新.我们相信分销商可以安全地发行这些插件.人们编写插件应该将他们的代码基 ...