mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1938回复:13

关于字节对齐问题

楼主#
更多 发布于:2002-11-12 17:39
那位给详细讲一下在驱动中的字节对齐问题,由于字节对齐的问题我的程序出的问题让我搞了两天,主要是一开始没有想到,所以有经验的给仔细讲讲可否??
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-12 18:39
是定义结构时出现的问题吗?试试

#pragma pack
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-11-12 20:38
在定义结构的前面加上
#pragma pack(1)表示字节对齐
在定义结构结束后加上
#pragma pack()
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-12 21:45
在定义结构的前面加上
#pragma pack(1)表示字节对齐
在定义结构结束后加上
#pragma pack()


否则
struct _OK
{
char a,
long b,
} OK;
很可能是8个字节。

 :o
[color=red]大头鬼! :P[/color]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-12 21:52
这个我会的,但是对字节对齐的意义不是很清楚,因为字节对齐这个问题对我的VXD影响很大,而且有一部分不是我写的,用的是4字节对齐,如果我在编译的选项里加上zp4,很多函数都出错误了,(我的打印的信息都不见了,就象没有运行到那些函数一样),如果一字节对齐有会在其他的地方引起内存错误
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-12 23:20
#pragma pack()这个语句用在。c里有用么??我记得在c里面是只对声明的结构和联合其作用的,对定义是不起作用的,可是原先的那个程序都是在。c里面用的#pragma pack(4),
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-13 09:33
大家都说一下啊,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2002-11-13 09:44
这个我会的,但是对字节对齐的意义不是很清楚,因为字节对齐这个问题对我的VXD影响很大,而且有一部分不是我写的,用的是4字节对齐,如果我在编译的选项里加上zp4,很多函数都出错误了,(我的打印的信息都不见了,就象没有运行到那些函数一样),如果一字节对齐有会在其他的地方引起内存错误



前面的哥们已经说的很清楚。

如果对齐不对的话,
你用数据结构中取到的东西会不对。例如:

typedef struct  _mytype
{
char a;
PNDIS_PACKET b;
}mytype;

mytype mytype1;
mytype1->b得到的指针值可能会不正确,
这种情况下发生任何事情都是有可能的。
不再回忆从前,我已经生活在幸福当中。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-13 09:51
这个我知道的啊,我迷惑的是下面的这个:
 

#pragma pack()这个语句用在。c里有用么??我记得在c里面是只对声明的结构和联合其作用的,对定义是不起作用的,可是原先的那个程序都是在。c里面用的#pragma pack(4),

原先的那部分程序都是在*.c文件头部,include的前面用的#pragma pack(4),然后在include完所有的头文件以后用#pragma hdrstop,
就是这样:
pragma pack(4)
#inculude\"\"
........
#pragma hdrstop
这两个连在一起用有什么作用??而且这样用#pragma pack(4)有作用么??

学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-13 10:09
这个我知道的啊,我迷惑的是下面的这个:
 [quote]
#pragma pack()这个语句用在。c里有用么??我记得在c里面是只对声明的结构和联合其作用的,对定义是不起作用的,可是原先的那个程序都是在。c里面用的#pragma pack(4),

原先的那部分程序都是在*.c文件头部,include的前面用的#pragma pack(4),然后在include完所有的头文件以后用#pragma hdrstop,
就是这样:
pragma pack(4)
#inculude\"\"
........
#pragma hdrstop
这两个连在一起用有什么作用??而且这样用#pragma pack(4)有作用么??

 [/quote]
BCB里常用的。
#pragma hdrstop是告诉编译器,precompile到这里结束可以缓冲进CSM文件了。一般Pack的用法是
#pragma pack(push)保存当前字对齐值。
#pragma pack(1)设置当前字对齐值
#pragma pack(pop)还原上次保存的值。



我思故我在,脑袋不会坏.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-13 10:14
pragma pack(4)
#inculude\"\"
........
BCB里这样设置以后是什么作用?在那些头文件里声明的结构就都按照4字节对齐了??我在MSDN里面怎么也看不出来这种用发:(
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-13 14:37
该死的Break due to General protection fault(0Dh)
Break due to page fault(0Dh)

这类错误后面的那些数字有什么意义么?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-13 15:05
该死的Break due to General protection fault(0Dh)
Break due to page fault(0Dh)

这类错误后面的那些数字有什么意义么?

中断13,一般性保护错误
我思故我在,脑袋不会坏.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-13 15:39
page fault(0EH)呢?后面还有一个fault=XXXX,没有见到这方面的资料,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
游客

返回顶部