C语言结构体所占用的字节数如何计算???

JamesArkham 2019-01-11 01:14:51
如题,

struct teacher
{
int num;
char name[10];
char sex;
int age;
float score;
}teacher1;

变量teacher1所占用的内存字节是24
这是怎么计算的?

貌似16位计算出来的是19
这又是怎么计算的?

大一新生求救
...全文
1308 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-01-11
  • 打赏
  • 举报
回复
可以了解一下结构体内存对齐和#pragma pack
  • 打赏
  • 举报
回复
可以关闭对齐(对齐到1字节)
自信男孩 2019-01-11
  • 打赏
  • 举报
回复 1
32位系统上:4+10+1+1(补齐) + 4 + 4 = 24 共补了一个字节
如果是16位系统:2 + 10 + 1 + 1(补齐) + 2 + 2 = 18 共补了一个字节,应该不会是19,因为结构体对其也是系统的整数倍(32位系统,需要是4的倍数,16位系统,需要是2的倍数)

以上的推测背景是Linux系统
赵4老师 2019-01-11
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1 { int a; char b[13]; double c;};
#pragma pack(2)
struct A2 { int a; char b[13]; double c;};
#pragma pack(4)
struct A4 { int a; char b[13]; double c;};
#pragma pack(8)
struct A8 { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
printf("AD.a %d\n",field_offset(AD,a));
printf("AD.b %d\n",field_offset(AD,b));
printf("AD.c %d\n",field_offset(AD,c));
printf("AD sizeof %d\n", sizeof(AD));
printf("\n");
printf("A1.a %d\n",field_offset(A1,a));
printf("A1.b %d\n",field_offset(A1,b));
printf("A1.c %d\n",field_offset(A1,c));
printf("A1 sizeof %d\n", sizeof(A1));
printf("\n");
printf("A2.a %d\n",field_offset(A2,a));
printf("A2.b %d\n",field_offset(A2,b));
printf("A2.c %d\n",field_offset(A2,c));
printf("A2 sizeof %d\n", sizeof(A2));
printf("\n");
printf("A4.a %d\n",field_offset(A4,a));
printf("A4.b %d\n",field_offset(A4,b));
printf("A4.c %d\n",field_offset(A4,c));
printf("A4 sizeof %d\n", sizeof(A4));
printf("\n");
printf("A8.a %d\n",field_offset(A8,a));
printf("A8.b %d\n",field_offset(A8,b));
printf("A8.c %d\n",field_offset(A8,c));
printf("A8 sizeof %d\n", sizeof(A8));
printf("\n");
printf("A16.a %d\n",field_offset(A16,a));
printf("A16.b %d\n",field_offset(A16,b));
printf("A16.c %d\n",field_offset(A16,c));
printf("A16 sizeof %d\n", sizeof(A16));
printf("\n");
return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//
Snowlotus1987 2019-01-11
  • 打赏
  • 举报
回复
需要考虑对齐要求alignment requirement
lin5161678 2019-01-11
  • 打赏
  • 举报
回复
没有统一有效的算法
都是按照具体编译环境处理的
只保证一定可以存下所有成员

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧