c关于结构体的size

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef unsigned char uint8_t;
struct AA{
    uint8_t a;
    uint8_t *st;
};
int main(int argc,char *argv[])
{
    AA a;
    a.a=0x11;
    a.st=new uint8_t[10];

    printf("%d",sizeof(AA)/sizeof(uint8_t));
    return 0;
}

为什么结果不是输出11(1+10)或者 2(a和st各占1),而是输出8呢?

阅读 2.8k
4 个回答

AA.a一个字节,AA.st是一个指针,在32位应用下是4字节,而不是10字节,10字节数组是指针指向的一块内存,应该在heap里面,而AA在栈里。

32位系统下,AA占5个字节,可能编译设置使用4字节边界,也就是所有变量类成员起始地址都是4个倍数,这样cpu读写快几倍。所以AA本来占用5字节,但编译器给它分配8字节,这样AA.a和AA.st的地址都是4的整数倍。

所以sizeof(AA)等于8

64位机器上有padding

32位下 由于结构体内存对齐,AA占用8字节,a后有3字节的padding,指针占用4字节
sizeof(AA)大小为8字节,uint8_t为unsigned char的typedef,大小为1字节
所以sizeof(AA)/sizeof(uint8_t)=8/1=8
64位下,指针占用8字节,由于结构体内存对齐,AA大小为1 + (补齐7位) + 8 = 16字节
则sizeof(AA)/sizeof(uint8_t)=16/1=16

补充下:结构体内仅包含其成员,不包含其指针成员指向的内存

新手上路,请多包涵

输出8的原因,我猜测你的程序是64位编译,所以AA结构体大小是16个字节,按8字节对齐,指针占了8个字节,所以另外一个变量也是8字节;然后直接sizeof(uint8_t)=2,所以16/2=8 这就是你的输出结果

struct AA{
    uint8_t a;
    uint8_t *st;
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题