C语言中结构体占用内存大小的问题
2014-04-22 10:55 Deng_Ran | 分类:C/C++ | 浏览381
struct stOne            // 结构体1
{
    char c1;
    int i1;
    char c2;
    int i2;
};

struct stTwo        // 结构体2
{
    char c1;
    char c2;
    int i1;
    int i2;
};

各位大侠,上面两个结构体因为硬件的边界调整原则,占用内存大小并不相同。在我的电脑上,sizeof(struct stOne)是16,sizeof(struct stTwo)是12。

小弟有一疑问,会不会存在一种情况:
struct stOne stA, stB;    // 定义两个结构体
这两个结构体大小并不相同,即同一类型结构体能否占用不同内存大小?
分享到:
2014-04-22 11:01 提问者采纳
你好,struct stOne stA, stB;    // 定义两个结构体
这两个结构体大小完全相同!!
追问
谢谢大侠回复,小弟还有一问题请教:

struct stOne
{
    char c1;
    int i1;
    char c2;
};

char类型变量的边界是1,int类型变量的边界是4,那么,我感觉这个结构体的大小是1 + (3) + 4 + 1 = 9,但实际上占用的内存是12?
回答
是的,最后的大小就类似于一个由几根木板组成的 长方形,也许每根的长度都不一样,但是
都要按照最长的那根那样存放,所以占用内存= 最长的那根 X 根数

有3个变量所以 4*3 =12
其他3条回答
2014-04-22 11:03 阳顶天鹿鼎记 | 七级
不会,同一个结构体占用的内存都是一样的,
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
字符串长度和占用内存字节64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
评论 | 3 0
2014-04-22 11:04 冰血无双 | 七级
不会不同,自己查一下 数据补齐、数据对齐,还有内存页的概念
评论 | 1 0
2014-04-22 11:05 ylx2193395 | 三级
这是因为字节对齐原则,在Linux下其是按2字节对齐,可是在VC++下默认是按8字节对齐,必须满足4的整数倍。这样有助于存储效率。第一个char 为1字节,int为4字节,由于8字节对齐原则系统会预留出3个字节,保证8个字节对齐。而第二个两个char 2个字节,1个int4字节,系统补充2个字节后,此时8个字节,再加一个Int为12.满足条件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。