我在编程中自定义了一个结构,其中包含了不同类型的数据成员。我在使用时通过对结构变量的指针对其赋值,但其运行结果总是和所想的不同。我将代码移到TC中运行,却一切正常。后来用sizeof来检查结构的长度,却发现有所不同。在TC中结构总长等于所有成员变量的长度之和,但在VC中其结构的长度却大于各个成员的长度总和。比如一个简单的结构:
struct st{
  char data0;   //在TC和VC中都有sizeof(char)==1
  short int data1;  //在TC和VC中都有sizeof(short int)==2
  long int data2;   //在TC和VC中都有sizeof(long int)==4
}
在TC中该结构的长度为1+2+4=7,而在VC中其长度却为12。为什么,谁能给我个解释

解决方案 »

  1.   

    修改 project setting 
     C/C++选项 code generation 修改为 1 Byte
      

  2.   

    字节对齐。默认情况下,VC是按照4字节对齐方式来编译的,但你可以改变这个预编译设置。
    讲一个最简单的例子,如果你有一个6字节长度的结构,默认情况下,编译器会把它转换为8字节的结构,这样处理起来横适合于32位的系统;而如果你改变了这个选项,编译器就可能会按照6字节进行处理。差别不是很大,但效率有点差异。这样可以改动
    #pragma pack( push )
    #pragma pack( 2 )
    typedef struct 
    {
       WORD            idReserved;   // Reserved (must be 0)
       WORD            idType;       // Resource type (1 for icons)
       WORD            idCount;      // How many images?
       GRPICONDIRENTRY   idEntries[1]; // The entries for each image
    } GRPICONDIR, *LPGRPICONDIR;
    #pragma pack( pop )
      

  3.   

    可这样设置:
    project菜单->settings->c/c++标签->category组合框中选择:code generation.这时你会看到"struct member alignment"字样,你可以从它下面的组合框中选为1byte,这样就等于没有字节对齐的影响了。
      

  4.   

    再任何时候都应该相信sizeof,他永远正确的返回你的类型的大小。
      

  5.   

    是不是int 的问题 ? vc 中int 是四个字节的
      

  6.   

    JennyVenus() :
    奇怪!不管我将"struct member alignment"改成1,2,4,8,16,我得出来的sizeof(st)都是8!!!
      

  7.   

    // fortest.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "stdio.h"struct st
    {
    char data0;   //在TC和VC中都有sizeof(char)==1
    short int data1;  //在TC和VC中都有sizeof(short int)==2
    long int data2;   //在TC和VC中都有sizeof(long int)==4
    };
    #pragma pack( push )
    #pragma pack( 1 )
    struct st1
    {
    char data0;   //在TC和VC中都有sizeof(char)==1
    short int data1;  //在TC和VC中都有sizeof(short int)==2
    long int data2;   //在TC和VC中都有sizeof(long int)==4
    };
    #pragma pack( pop )int main()
    {
    printf( "%d\n", sizeof( struct st ) );
    printf( "%d\n", sizeof( struct st1 ) );
    return 0;
    }结果8
    7
    Press any key to continue第一个等于8,具体不清楚,大概是因为1+2<4,所以被组合成4个了
      

  8.   

    定义结构的时候,大概编译器会把相邻的比较小的成员按照最佳组合合并起来,如果你改变了相关的类型,应该能够得出规律。
    #include "stdafx.h"
    #include "stdio.h"#pragma pack( 1 )
    struct st
    {
    char data0;   //在TC和VC中都有sizeof(char)==1
    char data1;  //在TC和VC中都有sizeof(short int)==2
    long int data2;   //在TC和VC中都有sizeof(long int)==4
    };
    #pragma pack( pop )int main()
    {
    printf( "%d\n", sizeof( struct st ) );
    return 0;
    }这样结果就是6,因为对内存访问还有偶数速度快等说法。