struct的小秘密

C语言中的struct可以看做变量的集合,struct的问题:

空结构体占用多大内存?

例子1:空结构体的大小

#include<stdio.h>
struct ST
{ };
int main()
{
printf("sizeof(struct ST) = %d\n",sizeof(struct ST));
return 0;
}

这是C语言的灰色地带,各种解释没有谁对谁错。

结构体与柔性数组

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

例子2:柔性数组分析

#include<stdio.h>
#include<stdlib.h>
typedef struct _SoftArray
{
int len;
int array[];
}SoftArray; int main()
{
int len = 10,i=0;
SoftArray *p = (SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*len);
p->len = len;
for(i-0;i<len;i++)
{
p->array[i] = i+1;
}
for(i=0;i<len;i++)
printf("array[%d] = %d\n",i,p->array[i]); free(p);
return 0;
}

C语言中的union

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

例子3:struct和union

struct A
{
int a;
int b;
int c;
};
union B
{
int a;
int b;
int c;
};
int main()
{
printf("%d\n",sizeof(struct A));
printf("%d\n",sizoef(struct B));
return 0;
}

union的注意事项

union的使用受到系统小大端的影响

例子4:判断大小端的模式

union A
{
int a;
char c;
};
int main()
{
union A test;
test.a = 0x1234;
printf("test.c = %x\n",test.c); //34
return 0;
}

由上面结果可以知道,本机为小端模式。

小结

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

struct和union的更多相关文章

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

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

  2. 【转】C/C++ struct/class/union内存对齐

    原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...

  3. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  4. struct 和union的区别

    union ( 共用体):构造数据类型,也叫联合体  用途:使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 ):是一种构造类型 用途: 把不同的数据组合成一个整体——自定义数据 ...

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

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

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

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

  7. struct与 union的基本用法

    结构体与联合体是C语言的常见数据类型,可对C的基本数据类型进行组合使之能表示复杂的数据结构,意义深远,是优异代码的必备工具.一.        struct与 union的基本用法,在语法上union ...

  8. c++ struct enum union加typedef与不加typedef

    struct/enum/union加typedef与不加typedef 匿名结构体 struct { int a; int b; } v; // 这里表示定义了一个结构体的变量v,且结构体类型没有名字 ...

  9. struct与union字节大小的终极解释

    1.字节对齐的细节和编译器实现相关,但一般而言,如在windows下,就VC而言,满足一下三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除:2) 结构体每个成员相对于结构体首地址 ...

随机推荐

  1. Map实现缓存

    为什么要使用缓存 缓存最终的目的是为减轻服务端压力,减少网络传输请求 客户端缓存 浏览器访问自带缓存~~ 页面缓存 浏览器缓存 App客户端缓存    IOS 前端开发     底层都有缓存技术的 ( ...

  2. easyui 在日期不满足要求的情况下,让修改链接不可点,或者修改消失

    *****略***** columns:[[ {field:'id',checkbox:true}, {field:'mDate',width:10,title:'菜单日期',align:'left' ...

  3. java基础知识一

    1.计算机基础知识概述 (1) 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处 ...

  4. LR工作原理

    LoadRunner的总体架构图,包括各个组件VUGen, Controller和Analysis之间的关系. LoadRunner由四大组件组成:VuGen.控制器.负载发生器和分析器. 1.VuG ...

  5. 以太坊EVM1.0缺陷

    256位的虚拟机 目前主流的CPU是32位或64位,在这些机器上进行256位运算需要将256位分段成多个64位指令执行,执行效率比32/64位低,在存储上方面,保存一个数需要256位的存储空间,绝大多 ...

  6. html5--6-67 阶段练习8-弹性三列布局

    html5--6-67 阶段练习8-弹性三列布局 学习要点 运用弹性盒子模型完成一个三列布局,加深对学过知识点的综合应用能力. 了解用百分比设置元素高度的方法. @charset="UTF- ...

  7. CMake学习记录--list(列表操作命令)

    CMake是一个跨平台的工程管理工具,能方便的把工程转换为vs各个版本.Borland Makefiles.MSSYS Makefiles.NMake Makefiles等工程,对于经常在不同IDE下 ...

  8. @font-face 用fontsquirrel把ttf文件获取别的文件格式

    @font-face是css3的一个模块,但是@font-face这个功能早在IE4就支持了,他主要是把自己定义的Web字体嵌入到你的网页中, @font-face { font-family: &l ...

  9. lua 与C通过c api传递table (2)

    本文转自http://blog.csdn.net/a_asinceo/article/details/49907903(感谢...) 一.单个参数的传递 首先我们在Lua中注册一个C类PJYCallb ...

  10. 【旧文章搬运】ZwQuerySystemInformation枚举内核模块及简单应用

    原文发表于百度空间,2008-10-24========================================================================== 简单说,即 ...