struct的大小不等于其内容的大小

时间:2012-09-22 14:49:37

标签: c memory struct byte sizeof

  

可能重复:
  Why isn't sizeof for a struct equal to the sum of sizeof of each member?

我有下一个代码:

http://ideone.com/brmRy

#include <stdio.h>
#include <stdlib.h>

typedef struct Test
{
        int a;
        int b;
        char c;
} Test;

int main(void)
{
        Test *obj = (Test*)malloc(sizeof(Test));

        printf("Size results:\r\n\r\nstruct: %i\r\nint #1: %i\r\nint #2: %i\r\nchar #1: %i\r\n", 
                sizeof(Test), sizeof(obj->a), sizeof(obj->b), sizeof(obj->c));

        return 0;
}

结果是:

  

尺寸结果:

     

struct:12

     

int#1:4

     

int#2:4

     

char#1:1

为什么结构大小为12个字节? int - 4个字节 char - 1个字节

2 int + 1 char = 2 * 4 bytes + 1 byte = 9 bytes。

为什么12 ???

2 个答案:

答案 0 :(得分:2)

内存通常在4字节边界上对齐,因此即使char只占用1个字节,它也会填充3个字节以满足此分段要求。值得注意的是,结构的各个元素不必对齐,因此如果将其中一个整数形成为short,则可以将结构大小从12减少到8个字节。我相信你必须把结构声明中的字符旁边的短片放到这个奖金上。

答案 1 :(得分:1)

如果你正在使用gcc,你可以强制“打包”。这意味着没有进行任何对齐,并且结构条目彼此相邻。尝试

typedef struct Test
{
    int a;
    int b;
    char c;
} __attribute__((packed)) Test;