当前位置: 技术问答>linux和unix
unix下,如何使得结构按1字节进行内存对齐?
来源: 互联网 发布时间:2015-09-29
本文导语: 我使用#pragma进行1字节的内存对齐,方法如下: #pragma (push,1) typedef struct _tagKeyComTime { WORD wYear; BYTE btMonth; BYTE btDay; BYTE btHour; BYTE btMinute; BYTE btSecond; } KeyComTime ; #pragma (pop) 打印: printf("sizeof(KeyComTime) = %d n"...
我使用#pragma进行1字节的内存对齐,方法如下:
#pragma (push,1)
typedef struct _tagKeyComTime
{
WORD wYear;
BYTE btMonth;
BYTE btDay;
BYTE btHour;
BYTE btMinute;
BYTE btSecond;
} KeyComTime ;
#pragma (pop)
打印:
printf("sizeof(KeyComTime) = %d n",sizeof(KeyComTime));
结果:
sizeof(KeyComTime) = 8
1字节进行内存对齐后,sizeof应该为7的啊!如何有效的使得结构按1字节进行内存对齐?
#pragma (push,1)
typedef struct _tagKeyComTime
{
WORD wYear;
BYTE btMonth;
BYTE btDay;
BYTE btHour;
BYTE btMinute;
BYTE btSecond;
} KeyComTime ;
#pragma (pop)
打印:
printf("sizeof(KeyComTime) = %d n",sizeof(KeyComTime));
结果:
sizeof(KeyComTime) = 8
1字节进行内存对齐后,sizeof应该为7的啊!如何有效的使得结构按1字节进行内存对齐?
|
改成
#pragma pack ( 1)
typedef struct _tagKeyComTime
{
WORD wYear;
BYTE btMonth;
BYTE btDay;
BYTE btHour;
BYTE btMinute;
BYTE btSecond;
} KeyComTime ;
#pragma pack ( )
#pragma pack ( 1)
typedef struct _tagKeyComTime
{
WORD wYear;
BYTE btMonth;
BYTE btDay;
BYTE btHour;
BYTE btMinute;
BYTE btSecond;
} KeyComTime ;
#pragma pack ( )
|
出现Bus error是你应用程序的问题,
与#pragma pack无关,我们都是这样加的,没有问题。自己检查吧。
与#pragma pack无关,我们都是这样加的,没有问题。自己检查吧。
|
强烈建议不要硬改对齐模式, 因为这样很容易会使某个整型数的起始地址处在奇地址上, 比如:
struct aa
{
char a __attribute__ ((packed));
int i;
};
这个里面的i就处在奇地址上(一般来说结构整体总是处在偶地址上的), 对于这样奇地址变量i, 在很多unix操作系统中(比如Sun 的Saloris)是不支持访问的, 你一旦读出或者给它赋值,就会发生“Bus error”错误,整个程序马上会崩溃的.
这个是和Windows编程有着很大的不同,大家可要注意了.....
struct aa
{
char a __attribute__ ((packed));
int i;
};
这个里面的i就处在奇地址上(一般来说结构整体总是处在偶地址上的), 对于这样奇地址变量i, 在很多unix操作系统中(比如Sun 的Saloris)是不支持访问的, 你一旦读出或者给它赋值,就会发生“Bus error”错误,整个程序马上会崩溃的.
这个是和Windows编程有着很大的不同,大家可要注意了.....