我定义了一个结构
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里在那里改啊?

解决方案 »

  1.   

    内存对齐!这样改一下设置:
    [ALT+F7] ==> [C/C++] ==> [ Category(Code Generation) ] 
    ==> [Struct member Aligiment] ==>( 1 Byte )重新编译(Rebuild ALL )就可以了。
      

  2.   

    在vc中存在字对齐现象,默认的是8bytes,改成1bytes就没有事情了
      

  3.   

    CHAR和char是不同的,同意wxzfox(乐乐)。
      

  4.   

    如果只想在这个结构体用1字节对其,可以用#pragma pack控制h文件中定义:#pragma pack(push,beforeStruct,1)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;#pragma pack(pop,beforeStruct,1)这样不影响其他结构体和类。
      

  5.   

    再结构体前加入
    #pragma pack(1)
    就可以了,确定以一个字节为存储单位
      

  6.   

    The TCHAR data type is a Win32 character string that can be used to describe ANSI, DBCS, or Unicode strings. For ANSI and DBCS platforms, TCHAR is defined as follows:typedef char          TCHAR;  
      
    For Unicode platforms, TCHAR is defined as synonymous with the WCHAR type