结构体声明与内存对齐

1、结构体的声明:

  1)struct Student{

    int stu_id;

    char name[25]

    int age;

    char sex;

    };

  Student student1, student2;

  2)struct Student{

    int stu_id;

    char name[25]

    int age;

    char sex;

    }student1,student2;

  3)struct {

    int stu_id;

    char name[25]

    int age;

    char sex;

    }student1,student2;

  声明一个结构体只是一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元,为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据,即结构体本身不会被作为数据而开辟内存,真正作为数据而在内存中存储的是这种结构体所定义的变量。

2.结构体内存对齐:

  不同编译器,内存会有所不同,在存储结构体时会按照内存对齐进行处理,本文只考虑win32下情况,下表是不同数据类型在内存中所占的大小。

  char short int float long double long long long double
长度 1 2 4 4 4 8 8 8

  例1:没有挤占,int型所占空间最大,以int型对齐,即整体空间为4的位数。

  struct Student{

    int stu_id;              //占4位

    char name[25] ;      //字符数组为25位,对齐应该补3位

    int age;                //占4位

    char sex;             //占1位,对齐应该补3位

    };

  实际占内存大小为:40。

  例2:内部挤占,以int型空间对齐,即整体空间为4的位数。

  struct Student{

    int stu_id;              //占4位

    char name[25] ;      //字符数组为25位,取4的倍数,因此为占28位

    char sex;             //向上挤占,因此占0位

    int age;               //占4位

    };

  实际占内存大小为:36。

  例3:内部挤占,以double型空间对齐,即整体空间为8的位数。

  struct Student{

    int stu_id;              //int为4位,补4位

    char name[25] ;      //字符数组为25位,补7位,占32位

    char sex;             //char为1位,向上挤占,因此占0位

    double age;          //占8位

    };

  实际占内存大小为:48。

时间: 2024-11-09 02:49:25

结构体声明与内存对齐的相关文章

【C语言】结构体中的内存对齐问题

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨. 结构体内存对齐有三个原则; 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s

C语言结构体所占内存大小

用一道面试题题引入struct str1    {         char   a;         int    b;         float  c;     double d;  };char类型占用1个字节,int型占用4个字节,short类型占用2个字节,float占4字节,double占8字节:那么我们可能会犯一个错误就是直接1+4+2=7,认为该结构体占用7个字节.这是错的.百度一了下发现这是因为计算机中存在一种叫做内存对齐的机制导致了该结果的发生. 在计算机中通常会让CPU从

结构体所占内存大小

结构体所占内存大小划分原则: 1.划分字节,按照当前结构体中,字节数最大的类型作为划分单元.[这里面还有一些前提.下面的例子会详细说到] 2.以矩形块儿的形式划分. #include <stdio.h> /**划分示意图: 最小单元是 double所以 这个 地方按照8个字节作为最小单元来划分. */ struct student1 { double avgMark; int ID; }; /**划分示意图: 最小单元不能是数组这个地方的最小单元是 1个字节 */ struct student

关于结构体声明的一些写法

关于结构体声明的一些写法:第一点:#include<stdio.h>struct square{ int (*add)(int a,int b);};int square_add(int a,int b){ return a + b;} int main(){ struct square stu={ .add=square_add, }; //与下面无区别 stu.add=square_add; return 0;} 第二点:位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一

结构体中的数据对齐

c语言结构中需要注意的就是数据存储的对齐方式. 对齐的好处:对齐主要是为了方便数据的访问,提高计算机的处理速度,但同时它会浪费内存空间. CPU的优化规则大致是这样的:对于n字节的元素,它的首地址能被n整除,才能获得最好的性能. 对齐的使用原则: 1.一般的基本对齐原则是按着最大的基本类型的长度进行对齐.较小的元素可以组合起来填充一段内存,实现基本的对齐.前提是其满足条件2. 2.结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度. 3.在结构体中存在结构

union中结构体整合后字节对齐问题

续上篇博文:http://www.cnblogs.com/flamefox/p/4241176.html 上次把结构体的编译问题解决了,这次又来了新问题,客户端和服务器访问相同的结构,出现了bug 原始的代码如下(结构1): struct MsgInfo { union { struct //for exp { OBJID idType; USHORT usLevel; UINT unExp; }; struct //for learn { OBJID idType; USHORT usLeve

c语言----结构体--声明及定义

试着写点东西,主要为了巩固学习过的东西. 结构体?C语言中的结构体主要用来表达.定义一些自己想要的类型,例如日期,身份信息等等. 日期:2017-09-10 身份信息:姓名fakke,年龄23,身高180: 可以通过struct来实现.(个人感觉有点像python的字典) 定义的方式: 第一步:声明结构类型: struct   类型名字{ 变量类型1   变量名: 变量类型2  变量名: ... 变量类型3  变量名: }: 第二步:  2定义新的变量 struct date 变量名; 第三步:

C语言结构体声明中冒号的使用(占位符) &amp; C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示.一.位 域的定义和位域变量的说明位域定义与

浅谈结构体如何分配内存

今天把操作符sizeof用了个遍,各种类型基本都用了,最后发现结构体类型最麻烦.下面直接进入主题: (1)先是定义了如下结构体: struct{            char a;            int i;            double d;            }text; 然后用sizeof(text),预期结果是1+2+8 = 11???如果这样想就错了,答案是16. (2)然后,换一下变量的顺序: struct{            char a; double d