内存对齐模式与结构体

1、结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充。

struct STU{

int age;

char name[15];

};

struct STU  a;   //结构体实例

struct STU  *b;  //结构体指针

(1).可以通过a.age对其进行取成员的操作,b->age也可以进行结构体的操作。

b->age存在问题,必须有一个结构体空间已经让b指向,b的值为此结构体空间的地址。

(2).a.name = "lilei"; false,因为name是数组名称,指针常量不能赋值,解决方案:strcpy()函数;

(3).字符串直接进行比较的话,是其地址的比较,没有什么意义,用strcmp()函数进行比较,就是ASCII码的比较了。

2、内存对齐模式:

操作系统对于内存空间的分配,遵循如下原则:总是从2^n倍数为地址的字节处开始分配空间

如:若按4B对其模式的话,则每个变量(结构体成员)的首地址总是从编号为4的整数倍的字节处开始分配空间。

可设几字节对齐如下:

#pragma pack(push)    //保持原对齐格式

#pragma pack(1)      //设定为n字节格式

.......

#pragma pack(pop)     //恢复为原对齐格式

3、结构体大小:

(1).总大小是下一个类型的整数倍,否则用单字节补齐(单字节最多补到4/8,具体看结构体中最宽几字节)      //总大小指的是前面字节总数和当前的字节数之和。

    (2).结构体大小是最宽字节的整数倍(一般情况下为4或8)

    (3).上述两个条件必须同时成立。若最终结果不成立的话,则补齐整数倍即可。

4、下面举例论证结构体大小:

(1). struct TEST{

int a;

short b;

char c;

struct TEST *next;

};

分析如下:4->2->1 (补1字节)->4   共12字节。

(2).借用一中的结构体

struct TEST1{

short d;

int e;

char f;

struct TEST g;

struct TEST1 *next;

struct TEST h;

char i;

};

分析如下:2(补2字节)->4->1(补3字节)->12->4(想补也不能补,最多补到最宽单字节,在这最多到4字节,已经为4字节了,所以不能在补了)->12->1

一共为:41字节,但是结构体大小为最宽单字节的整数倍,在这应为4的整数倍。

最终,此结构体大小为44字节。

(3).借用一中的结构体

struct TEST2{

short d;

int e;

double f;

struct TEST1 *next;

struct TEST g;

char i;

};

分析如下:2(补2字节)->4->8->4(补4字节:前面一共16字节,当前4字节,所以总共20字节,不是下一个数据类型(12)的整数倍,且最宽为8字节,可补4字节,构成整数倍)->12->1

一共为37字节,但是结构体大小为最宽单字节的整数倍,在这应为8的整数倍。

最终此结构体大小为40字节

结构体类型极大的扩充了C语言,是数据类型更加丰富多彩!

时间: 2024-10-12 19:03:48

内存对齐模式与结构体的相关文章

C语言共享内存使用思路利用结构体

这里不介绍如何创建共享内存,如果想知道百度一下就好了.只介绍一下如何使用这一段连续的共享内存空间.思路就是利用结构体. 创建一个结构体,它的大小可以用sizeof()获取.注意这里有一个四字节对齐的问题,所以结构体的大小不仅仅是结构体内变量所占内存的简单相加. 思路:你创建一个结构体,无论你的结构体怎样,利用memcpy函数配合sizeof将结构体变量,copy到共享内存中然后,用的时候再用memcpy从共享内存copy到结构体中就行了. 一个例子如下: #include <string.h>

你必须知道的指针基础-6.内存的初始化及结构体的使用

一.内存的使用 1.1 你创建的内存区域可能是脏的 当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char chs[20]; // 这个代码打印出来的可能就是乱码,因为printf的%s是“打印一直遇到'\0'”. printf("%s\n",chs); return 0; } 其运行结果是如下图所示的

struct的成员对齐问题-结构体实际大小问题

struct的成员对齐 注意:为了方便说明,等号左边是每个数据单独所占长度,右边是最终空间大小,以字节为单位. 一.什么时间存在对其问题:(32位机对齐方式是按照4字节对其的,以下所有试验都是在32位机上验证的) 当结构体成员数据按照其顺序组合,无法按4字节对齐时,存在对其问题. 如: 1+1=2: 1+2=3: 1+2+1=4(而不是6或者其他): 2+1=3:(不是4) 以上是不存在对其问题的(因为没有超过4字节). 如: 1+4=8: 4+1=8: 1+4+1=12: 1+2+4=8: 1

关于内存对齐的那些事

Wrote by mutouyun. (http://darkc.at/about-data-structure-alignment/) 1. 内存对齐(Data Structure Alignment)是什么 内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property of a memory address). 这个属性是一个无符号整数,并且这个整数必须是2的N次方(1.2.4.8.--.1024.--). 当我们说,一个数据类型的内存对齐

内存对齐的规则以及作用

首先由一个程序引入话题: //环境:vc6 + windows sp2 //程序1 #include <iostream> using namespace std; struct st1 { char a ; int b ; short c ; }; struct st2 { short c ; char a ; int b ; }; int main() { cout<<"sizeof(st1) is "<<sizeof(st1)<<e

C语言中的内存对齐

由下面的测试代码可以总结出两点:(1)内存对齐是针对结构体而言的    (2)编译时char类型的申请的空间由其后面的数据类型决定. #include<stdio.h> enum Season { Spring,Summer,Autumn }; enum ENUM Enum = Autumn; union UNION { int a; char b; double c; }; union UNION Union; struct STRUCT { char b; //4字节 int a; //4

结构体的内存空间分配及字节对齐

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,那

结构体对齐详解【转】

 1 -- 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度.比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个

内存对齐分配策略(含位域模式)

1. 内存对齐定义 现在使用的计算机中内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际上计算机系统对于基本数据类型在内存中的存放位置都有限制,要求这些数据存储首地址是某个数K的倍数,这样各种基本数据类型在内存冲就是按照一定的规则排列的,而不是一个紧挨着一个排放,这就是内存对齐. 对齐模数 内存对齐中指定的对齐数值K成为对齐模数(Alignment Modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐