结构体占字节数问题

时间:2023-01-11 10:21:30
#include <stdio.h>
struct cesh
{
char a;
int i;

}cesh;
void main()
{
printf("%d\n",sizeof(cesh));
}
为什么输出结构是8呢?求解!

6 个解决方案

#1


内存对齐

#2


参考:
http://blog.csdn.net/hbyh/archive/2008/01/23/2061471.aspx

#3


参考《你必须知道的》495个C语言问题第二章结构体-结构填充。
内存中的值对齐后有利于按字节寻址。
编译器在char和int之间留下一个没有命名也没有使用的空间。

#4


自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。
例如:
struct naturalalign
{
    char a;
    short b;
    char c;
};
在上述结构体中,size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐,
sizeof(naturalalign)的结果等于6;
如果改为:
struct naturalalign
{
    char a;
    int b;
    char c;
};
其结果显然为12。
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体
仍然按照size 最大的成员进行对界。

位域判断:
当碰到一个结构体的时候你首先去找里面字节长度最大的类型。
struct str
{
    char i:3,
    char j:4,
    unsigned short k:5,
    unsigned long m:9,
};
如这个结构体长度最大的为long,而long为4个字节,那么后面都是以4的倍数成增长的,也就是4、8、16...
首先开始给第一个char分配了4个字节的内存用来存放i,而第二个也是char。第一次分配的4字节完全可以容纳下了,所以把j也放入最初申请的4字节内存里面去,第三个是short,两个字节,刚才的4字节还没有使用完,也恰巧可以再放2个字节,所以把k也放入进去,最后一个long占4字节,当然是放不到最初分配的4字节里面去了,所以需要新分配4字节内存,这样4+4 = 8

#5


struct cesh
{
char a;
int i;
}cesh;
// 32位机默认内存四个字节对齐,方便处理。
// char a一个字节,需要填充三个字节。
struct cesh
{
char a;
char b;
char c;
int i;
}cesh;
struct cesh
{
char a;
char b;
char c;
char d;
int i;
}cesh;

这几种写法都是一样,sizeof(cesh)==8;

#6


资料就不复制了,网上一大堆:
http://blog.csdn.net/xuxinshao/archive/2008/04/02/2244277.aspx

#1


内存对齐

#2


参考:
http://blog.csdn.net/hbyh/archive/2008/01/23/2061471.aspx

#3


参考《你必须知道的》495个C语言问题第二章结构体-结构填充。
内存中的值对齐后有利于按字节寻址。
编译器在char和int之间留下一个没有命名也没有使用的空间。

#4


自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。
例如:
struct naturalalign
{
    char a;
    short b;
    char c;
};
在上述结构体中,size 最大的是short,其长度为2 字节,因而结构体中的char 成员a、c 都以2 为单位对齐,
sizeof(naturalalign)的结果等于6;
如果改为:
struct naturalalign
{
    char a;
    int b;
    char c;
};
其结果显然为12。
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体
仍然按照size 最大的成员进行对界。

位域判断:
当碰到一个结构体的时候你首先去找里面字节长度最大的类型。
struct str
{
    char i:3,
    char j:4,
    unsigned short k:5,
    unsigned long m:9,
};
如这个结构体长度最大的为long,而long为4个字节,那么后面都是以4的倍数成增长的,也就是4、8、16...
首先开始给第一个char分配了4个字节的内存用来存放i,而第二个也是char。第一次分配的4字节完全可以容纳下了,所以把j也放入最初申请的4字节内存里面去,第三个是short,两个字节,刚才的4字节还没有使用完,也恰巧可以再放2个字节,所以把k也放入进去,最后一个long占4字节,当然是放不到最初分配的4字节里面去了,所以需要新分配4字节内存,这样4+4 = 8

#5


struct cesh
{
char a;
int i;
}cesh;
// 32位机默认内存四个字节对齐,方便处理。
// char a一个字节,需要填充三个字节。
struct cesh
{
char a;
char b;
char c;
int i;
}cesh;
struct cesh
{
char a;
char b;
char c;
char d;
int i;
}cesh;

这几种写法都是一样,sizeof(cesh)==8;

#6


资料就不复制了,网上一大堆:
http://blog.csdn.net/xuxinshao/archive/2008/04/02/2244277.aspx