struct-数组和结构体对齐关系,求大神解决!

问题描述

数组和结构体对齐关系,求大神解决!

#include
typedef struct
{

unsigned char a;

unsigned char b;
unsigned int c;

unsigned short d;

unsigned int e;
} ABC;

const unsigned short code1[6] = {0x1607,0x1003,0x1008,0x2001,0x3002,0x4003};
void main(void)
{
ABC * p = (ABC *)&code1[0];
printf("%Xn",p->c);

}
请问:输出的是 0x20011008
为什么不是0x10081003 ?

解决方案

这个确实和字节对齐有关系,前提是编译器是32-bit的。
在内存中映射的数据,是这样的:
07 16 03 10 08 10 01 20 02 30 03 40
对于int型,每个占用4个byte,必须是4字节对齐。所以起始地址必须是4的倍数。这是编译器优化的结果。
所以一般在定义结构体的时候,为了避免这个问题,我们往往会重新组织一下数据,进行4字节对齐:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned short d; d和c换一下位置。
unsigned int c;
unsigned int e;
} ABC;
如果不能交换位置,比如图形文件的header,必须是字节一一对齐。那一般采用这个方式:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c[4];
unsigned char d[2];
unsigned char e[4];
} ABC;
然后根据平台的大小端转换成正确的值

解决方案二:

http://baike.baidu.com/link?url=V5ebpDRZwlUc1Bi08VZ4RBh9riTwRcemJ07DsYjTbHN3gIYCoOMC-m9F3xMAR8m4u7n_ytZPOoJOIVS_HWziF_

解决方案三:

这个和对齐没关系,intel是小端序的,所以,高位在后面。

解决方案四:

看错了,确实是对齐的问题

解决方案五:

p->a=0x07
p->b=0x16

p->c为什么不是输出p->b地址后的4个字节,而是直接跳过0x1003。

解决方案六:

这样就看得很清楚了,是不是

解决方案七:

结构体占用空间的分析

但这个问题,是大端与小端的问题。Intel 是低字节在前,例如:0x1234,在内存中是 0x34 0x12。

时间: 2024-12-22 21:43:10

struct-数组和结构体对齐关系,求大神解决!的相关文章

c语言-一道C语言用结构体排序的题目 大神快来帮我理解下人家的代码~~~

问题描述 一道C语言用结构体排序的题目 大神快来帮我理解下人家的代码~~~ 描述 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管.这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下: 1. 这根钢管一定要是仓库中最长的: 2. 这根钢管一定要是最长的钢管中最细的: 3. 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近). 相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根-- 要不,还是请你编

计算机组成与结构的题,求大神指教!!!1

问题描述 计算机组成与结构的题,求大神指教!!!1 若阶码为三位用补码表示,尾数7位用原码表示,其中1位为符号位,以2位底.则十进制数27/64的浮点规格化数是 解决方案 0,111,110110

有什么办法能让英文网页的文字左右都对齐?现在的情况是要么只能左对齐,要么只能右对齐,求大神帮忙

问题描述 有什么办法能让英文网页的文字左右都对齐?现在的情况是要么只能左对齐,要么只能右对齐,求大神帮忙 解决方案 http://blog.163.com/lgh_2002/blog/static/44017526201357114023638/ 解决方案二: 这个没有试过,如果你非得要这个效果可以用Div+css来弄的:或者你可以控制一下字符间距来减缓一下,使它看上去像两边对齐.

php-怎样删除二维数组中相同的一位数组 并保持相同键名 求大神写个函数

问题描述 怎样删除二维数组中相同的一位数组 并保持相同键名 求大神写个函数 Array ( [0] => Array ( [year] => 2013-2014 [term] => 1 [course_code] => 00008069 [course_name] => 咖啡世界 [course_nature] => 任意选修 [course_attribution] => 人文素养类 [credit] => 2.0 [point] => 4.1 [g

增删改查-求大神解决啊 用c语言

问题描述 求大神解决啊 用c语言 1.使用结构体保存学生信息,学生信息包含学号,姓名,性别,班级,语文成绩,数学成绩 2.用户可以进行学生信息的增删改查,要求使用switch为用户提供增删该查选项 3.在主函数中提供增删改查选项,使用函数完成增删该查具体功能 解决方案 http://zhidao.baidu.com/link?url=sOPqZ98X7FdSx7mCX12eUkiaaPIHPQe1GWfzrfU-QAwX0NWcXXfFEDu8vu25MftOxlmdqXMvFoNoPCVZ_R

急求大神解决一下这个问题c信号传递

问题描述 急求大神解决一下这个问题c信号传递 #include #include #include int main(int argc, char ** argv) { union sigval value; int signum = SIGTERM; // 默认发送SIGTERM pid_t pid; int i; /*初始化*/ value.sival_int = 0; /*检查参数的个数*/ if (argc != 3 && argc != 5 && argc !=

信息-C++编程问题,不是很懂,求大神解决

问题描述 C++编程问题,不是很懂,求大神解决 定义一个Computer类,包括数据成员CPU(字符串)和Memory(字符串),定义构造函数初始化CPU和Memory的值,定义函数showInfo()显示系统配置信息.定义一个MobilePhone类,包括数据成员联系人Contact(字符串数组),定义构造函数初始化Contact的值,定义函数display()显示联系人信息,定义函数call()拨打电话.定义派生类SmartPhone,继承Computer和MobilePhone类,新增数据

大二狗求大神解决数据结构里压缩矩阵程序的问题,悬赏5c币!

问题描述 大二狗求大神解决数据结构里压缩矩阵程序的问题,悬赏5c币! 5C #include using namespace std;#define N 10typedef struct{ int ij; int e;}tsMatrix;typedef struct{ tsMatrix data[N];/*最大长度为N */ int munutu;}TSMatrix; int FastTransposeSMatrix(TSMatrix MTSMatrix T) // 快速转置{int colpq

android studio的问题求大神解决!!!

问题描述 android studio的问题求大神解决!!! android studio 自己创建的项目就可以运行,但是导入的项目不能运行怎么解决啊?其他的导入方式也试过了,导入的项目上面的运行跟模拟器都是灰色的,而且项目里面每一个文件(布局文件除外)的右下角都会有一个红色的圆圈,圆圈里面是一红色的J字母. 解决方案 重新把项目构建一边,在 解决方案二: 小伙子 ,你按这篇帖子重新导入你的Eclipse项目.http://www.cnblogs.com/ct2011/p/4183553.htm