我定义了一个结构
typedef struct
{
CHAR cEdition;
CHAR cDate[3];
DWORD cSerial;
CHAR cDestr[8];
CHAR cFlag;
USHORT cCustomNo;
UCHAR cPayUnit;
USHORT cPayRate;
CHAR cRFU[2];
DWORD cCode;
LONG cMoney;
CHAR cUserName[8];
CHAR cUserPasswd[8];
} SCardInfo;char icbuf[200];
SCardInfo *pCi;//从IC卡上读入数据
pCi = (SCardInfo *)icbuf;却发现pCi->cCustomNo的值不对,经我详细跟踪才发现,cFlag和cPayUnit两个CHAR类型的值本来是应该占用1个字节,可是实际上却占用了2个字节,所以造成后面的结构成员都往后推移但奇怪的是同为CHAR类型的cEdition为什么只占用了1个字节呢?为了进一步求证,我将以下三个值打出来,结果跟我想要的一样,sizeof(SCardInfo) ------> 48
sizeof(char) ------> 1
sizeof(short) ------> 2可是实际上SCardInfo却占用了52个字节,这怎么解释呢?我又将结构改成这样定义,也不行,结果还是一样。
typedef struct
{
CHAR cEdition;
CHAR cDate[3];
DWORD cSerial;
CHAR cDestr[8];
CHAR cFlag :8;
USHORT cCustomNo :16;
UCHAR cPayUnit :8;
USHORT cPayRate :16;
CHAR cRFU[2];
DWORD cCode;
LONG cMoney;
CHAR cUserName[8];
CHAR cUserPasswd[8];
} SCardInfo;
我实在没办法了,救命啊!
有什么编译参数能改char的长度么?VC里在那里改啊?
[ALT+F7] ==> [C/C++] ==> [ Category(Code Generation) ]
==> [Struct member Aligiment] ==>( 1 Byte )重新编译(Rebuild ALL )就可以了。
{
CHAR cEdition;
CHAR cDate[3];
DWORD cSerial;
CHAR cDestr[8];
CHAR cFlag;
USHORT cCustomNo;
UCHAR cPayUnit;
USHORT cPayRate;
CHAR cRFU[2];
DWORD cCode;
LONG cMoney;
CHAR cUserName[8];
CHAR cUserPasswd[8];
} SCardInfo;#pragma pack(pop,beforeStruct,1)这样不影响其他结构体和类。
#pragma pack(1)
就可以了,确定以一个字节为存储单位
For Unicode platforms, TCHAR is defined as synonymous with the WCHAR type