struct和union,enum分析

空结构体占用的内存多大?

 1   struct d
 2   {
 3
 4   };
 5
 6   int main()
 7
 8   {
 9
10    struct d d1;
11
12    struct d d2;
13
14    printf("%d,%0x\n",sizeof(d1),&d1); //求内存大小,及结构体变量的地址
15    printf("%d,%0x\n",sizeof(d1),&d2);
16
17  }

不同的编译器,分配的大小不一样,一般取0个字节或1个字节。

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

1 struct softarray
2
3 {
4
5   int len;
6
7   int array[];
8
9 };

那么这个结构体的大小是多少?  最后的未知大小的数组处理为0个字节,所以说整个结构体变量的空间就是其他变量的空间之和。

 1 typedef struct _soft_array
 2 {
 3     int len;
 4     int array[];
 5 }SoftArray;
 6
 7 int main()
 8 {
 9     int i = 0;
10     SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);
11
12     sa->len = 10;
13
14     for(i=0; i<sa->len; i++)
15     {
16         sa->array[i] = i + 1;
17     }
18
19     for(i=0; i<sa->len; i++)
20     {
21         printf("%d\n", sa->array[i]);
22     }
23
24     free(sa);
25
26     return 0;
27 }

struct中每个域都在内存中分配空间;union只分配最大域的空间,所有域共享这个空间;union受系统大小端的影响:
大端模式:内存的高地址位存放数据的高字节

小端模式:内存的低地址位存放数据的高字节

 1 union c
 2
 3 {
 4
 5   int i;
 6
 7   char cc;
 8
 9 }  // 分配最大域空间,即4个字节
10
11 union c abc;
12
13 c.i=1;
14
15 printf("%d\n",c.cc); //大端模式:0,小端模式:1

enum:
是一种自定义类型,默认的常量的值均为整数,且第一个常量取值为0(如果不指定),其后的每一个常量均是在该常量前一个常量前加1,enum类型的变量只能取离散的值:

 1 enum color
 3 {
 5    green,
 7    red=2,
 9    blue,
11    black
13 };
14 enum color c =green;
15 printf("%d\n",c);  //0
16 enum color c =blue;
17 printf("%d\n",c);  //3
18 enum color c =black;
19 printf("%d\n",c); //4

枚举类型和#define的区别:
#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量

#define 宏常量美誉类型信息,enum是一种变量类型

typedf:

用来给一个已经存在的数据类型重命名,并没有产生新的类型,typedef重定义的类型不能进行unsigned和signed扩展。

typedef与#define的区别:

1 typedef char* path;
2 path p1,p2;  //相当于char* p1,char* p2
3 #define path char*;
4 path p1,p2;  // 相当于 char * p1,char p2
时间: 2024-11-09 11:41:26

struct和union,enum分析的相关文章

struct和union的区别

当初学习C语言时并没有特别注意 union 的用法,也不知道与 struc t相比有何不同.经过网上的一番搜索,现在总算是恍然大悟,所以就小结一下.如有错误之处,敬请指正.( struct 和 union 的结构定义形式没有多大差别,只要不是初学者,相信大家不会在这方面存在什么问题.) struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间.那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

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

这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今天把保存的资料重新拿出来温习一遍,同时写下这篇文章,对以前相关资料总结的同时顺便梳理一下已有的知识. 一.基本数据类型在内存中的长度 关于基本的数据类型,在不同的机器上占据的长度不一样.为了能够对数据的组合类型(这里只包括了struct和union)能够有一个清晰地认识,这里首先对基本的数据类型在不同位数(3

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

1.字节对齐的细节和编译器实现相关,但一般而言,如在windows下,就VC而言,满足一下三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除:2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding): 即:在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译

C之 struct 和 union(十)

在 C 语言中我们经常会使用到 struct 和 union,那么它们两个各自有何特点呢?今天我们就一探究竟. 我们先来介绍下 struct .它可以看做是变量的集合,那么一个空的结构体占多大内存呢?这是一个有趣的问题,按照理论分析,它应该是0.但是按照 C 语言的设计思想来说,不可能存在空结构体的,定义一个空结构体没意义啊,所以应该报错的.下来我们就分别在 gcc 和 BCC 编译器上实验下.由于代码比较简单,就不贴代码了,我们直接来结果.图一为在 gcc 编译器下编译的,图二为在 BCC 编

2015-10-20 关于struct和union

1.结构体: 1.1.思考题:空结构体占用多大内存空间? ANS:不同的编译器,这个结果是不定的.在GCC下,空结构体占用0个字节的空间.在G++编译器下,空结构体占用1个字节的空间. 1.2.一个新的概念----柔性数组 柔性数组:数组大小待定的数组. C语言中结构体的最后一个元素可以为一个大小未知的数组.于是可以利用该特性来产生柔性数组: struct _soft_array { int len; int array[]; }; 此处有一个问题是需要注意的:sizeof(_soft_arra

struct与union

1. union的长度 union { int k; int p[4]; double q; }data; sizeof(data)=20; //结构体中最大的数据长度 2.struct的长度 struct { int k; double q; }data; sizeof(data)=16; //结构体中最大的数据长度的倍数(默认情况,如果设置了不同的内存对齐另当别论): //如果以1字节.4字节对齐的话,sizeof(data)=12: 3.struct与union的联合使用 void str

&lt;转&gt; Struct 和 Union区别 以及 对内存对齐方式的说明

转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息. 2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在. 3.对于Union的不同成

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

原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru

C/C++ struct/class/union内存对齐

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon. 2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"