| 
			 
					阅读:2163回复:13
				 
				关于字节对齐问题
					那位给详细讲一下在驱动中的字节对齐问题,由于字节对齐的问题我的程序出的问题让我搞了两天,主要是一开始没有想到,所以有经验的给仔细讲讲可否??				 
							 | 
	|
					
						
						
						
						
  | 
	
| 
			 沙发# 
								发布于:2002-11-12 18:39				
			
					是定义结构时出现的问题吗?试试
 
							#pragma pack  | 
	|
| 
			 板凳# 
								发布于:2002-11-12 20:38				
			
					在定义结构的前面加上
 
							#pragma pack(1)表示字节对齐 在定义结构结束后加上 #pragma pack()  | 
	|
| 
			 地板# 
								发布于:2002-11-12 21:45				
			在定义结构的前面加上 否则 struct _OK { char a, long b, } OK; 很可能是8个字节。 :o  | 
	|
					
						
  | 
	
| 
			 地下室# 
								发布于:2002-11-12 21:52				
			
					这个我会的,但是对字节对齐的意义不是很清楚,因为字节对齐这个问题对我的VXD影响很大,而且有一部分不是我写的,用的是4字节对齐,如果我在编译的选项里加上zp4,很多函数都出错误了,(我的打印的信息都不见了,就象没有运行到那些函数一样),如果一字节对齐有会在其他的地方引起内存错误				 
							 | 
	|
					
						
  | 
	
| 
			 5楼# 
								发布于:2002-11-12 23:20				
			
					#pragma pack()这个语句用在。c里有用么??我记得在c里面是只对声明的结构和联合其作用的,对定义是不起作用的,可是原先的那个程序都是在。c里面用的#pragma pack(4),				 
							 | 
	|
					
						
  | 
	
| 
			 6楼# 
								发布于:2002-11-13 09:33				
			
					大家都说一下啊,				 
							 | 
	|
					
						
  | 
	
| 
			 7楼# 
								发布于:2002-11-13 09:44				
			这个我会的,但是对字节对齐的意义不是很清楚,因为字节对齐这个问题对我的VXD影响很大,而且有一部分不是我写的,用的是4字节对齐,如果我在编译的选项里加上zp4,很多函数都出错误了,(我的打印的信息都不见了,就象没有运行到那些函数一样),如果一字节对齐有会在其他的地方引起内存错误 前面的哥们已经说的很清楚。 如果对齐不对的话, 你用数据结构中取到的东西会不对。例如: typedef struct _mytype { char a; PNDIS_PACKET b; }mytype; mytype mytype1; mytype1->b得到的指针值可能会不正确, 这种情况下发生任何事情都是有可能的。  | 
	|
					
						
  | 
	
| 
			 8楼# 
								发布于:2002-11-13 09:51				
			
					这个我知道的啊,我迷惑的是下面的这个:
 
							
 原先的那部分程序都是在*.c文件头部,include的前面用的#pragma pack(4),然后在include完所有的头文件以后用#pragma hdrstop, 就是这样: pragma pack(4) #inculude\"\" ........ #pragma hdrstop 这两个连在一起用有什么作用??而且这样用#pragma pack(4)有作用么??  | 
	|
					
						
  | 
	
| 
			 9楼# 
								发布于:2002-11-13 10:09				
			这个我知道的啊,我迷惑的是下面的这个: 原先的那部分程序都是在*.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)还原上次保存的值。  | 
	|
					
						
  | 
	
| 
			 10楼# 
								发布于:2002-11-13 10:14				
			
					pragma pack(4)
 
							#inculude\"\" ........ BCB里这样设置以后是什么作用?在那些头文件里声明的结构就都按照4字节对齐了??我在MSDN里面怎么也看不出来这种用发:(  | 
	|
					
						
  | 
	
| 
			 11楼# 
								发布于:2002-11-13 14:37				
			
					该死的Break due to General protection fault(0Dh)
 
							Break due to page fault(0Dh) 这类错误后面的那些数字有什么意义么?  | 
	|
					
						
  | 
	
| 
			 12楼# 
								发布于:2002-11-13 15:05				
			该死的Break due to General protection fault(0Dh) 中断13,一般性保护错误  | 
	|
					
						
  | 
	
| 
			 13楼# 
								发布于:2002-11-13 15:39				
			
					page fault(0EH)呢?后面还有一个fault=XXXX,没有见到这方面的资料,				 
							 | 
	|
					
						
  |