一.结构体存储 #include<stdio.h> #include<stdlib.h> struct info{ char c; //1 2 4 8 double num; //1 2 4 8 char short int double ]; //9 10 12 16 }; void main() { printf("%d\n",sizeof(struct info)); struct info in={'a',5.2,"hello"};…
struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include <stdio.h> #include <string.h> struct People { int age; char name[100]; // 这里如果用指针,下面用 strcpy 赋值时会报段错误 }; // 分号必须有 int main() { struct People p =…
为什么要提出内存对齐? 比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作.否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上.(在有谢处理器上内存不对齐的话可能会出现错误) 一些例子(在vc的编译器上) 下面用前面的例子来说明VC到底怎么样来存放结构的. struct MyStruct…
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地.频繁地创建窗口对象导致内存碎片的产生).CMapPtrToPtr类用到了关联结构体 CAssoc,其中有好多对指针类型的转换,感觉对结构体了解不够.特别是成员的对齐方式,跟我猜测的完全不同,花了点时间搞清楚了.在跟朋友一起吃饭还有时间,就顺手写下来,供大家参考: 首先明白几个概念: 1.结构体成员的…
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地.频繁地创建窗口对象导致内存碎片的产生).CMapPtrToPtr类用到了关联结构体 CAssoc,其中有好多对指针类型的转换,感觉对结构体了解不够.特别是成员的对齐方式,跟我猜测的完全不同,花了点时间搞清楚了.在跟朋友一起吃饭还有时间,就顺手写下来,供大家参考: 首先明白几个概念: 1.结构体成员的…
来自:http://blog.163.com/zhangzhifeng688%40126/blog/static/1652627582010102261748481/ 给结构体指针分配内存  但在很多时候, 一些参数是结构指针; 特别是在接受数据时, 一般需要手动分配内存. 如果只使用一个单结构指针, 用 New 分配内存是最合适的, 譬如: -----------------------------------------------------------------------------…
因为结构体有时候需要字节对齐.一般而言,struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度. 在默认情况下,编译器为每一个变量或数据单元按其自然对界条件分配空间.一般地,可以通过下面的方法来改变默认的对界条件: (1) 使用伪指令#pragma pack(n),C编译器将按照n个字节对齐. (2) 使用伪指令#pragma pack(),取消自定义字节对齐方式. 字节对齐的细节和编译器实现相关,但一般而言,满足以下3个准则: (1)…
关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,那…
引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这样?这就是字节对齐导致的问题. 本文在参考诸多资料的基础上,详细介绍常见的字节对齐问题.因成文较早,资料来源大多已不可考,敬请谅解. 一,什么是字节对齐 现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量.但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种…
今天讲讲结构体存储问题 首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和 例如 我们可能会觉得是 结构体大小=int(4个字节)+ short(2个字节)+char(1个字节) = 7个字节 其实这样想是错误的 结构体的存储默认是向元素里最大的数据类型对齐的 上面的话是什么意思呢,还是以上个例子为例, 也就是这个结构体中,以int(4个字节)对齐,也可以理解做就是一行有int(4个字节)那么大 假如一个小格子为一个字节,先把int放入内存中,也就是…