结构体字节长度计算

a904235765 2015-09-19 08:30:19
定义一个如下的结构体:
struct node{
int a;
char b;
unsigned short k[3];
unsigned int q;
}test1;

int a;
a=sizeof(test1);

请问a的数值怎么是16,不是4+1+3*2+4=15么??
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-09-21
  • 打赏
  • 举报
回复
仅供参考:
#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("\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("\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("\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("\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("\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("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
qq_25073223 2015-09-21
  • 打赏
  • 举报
回复
在结构体中,结构体的长度等于所有类型长度的合计, 并且必须等于其中占用内存长度最大的成员项的整数倍。

#include "stdio.h"
struct adeal{
 int a;
 char *d;
};
struct adeal2{
  int a;
};
 
struct adeal3{
  char *d;
};
 
struct adeal4{
  short int a;
  char  d;
 };
 
int main(){
  int a1;
  short int a1_;
  unsigned  int a2;
  long int a3;
  unsigned long int a4;
  float a5;
  double a6;
  char a7;
  char *a8=&a6;
  struct adeal a9;
  struct adeal2 a10;
  struct adeal3 a11; 
  struct adeal4 a12;
  
  printf("整型长度:%d\n",sizeof(a1));
  printf("短整型长度:%d\n",sizeof(a1_));
  printf("无符号整型长度:%d\n",sizeof(a2));
  printf("长整型长度:%d\n",sizeof(a3)); 
  printf("无符号长整型长度:%d\n",sizeof(a4));
  printf("浮点型长度:%d\n",sizeof(a5)); 
  printf("双精度长度:%d\n",sizeof(a6));
  printf("字符型长度:%d\n",sizeof(a7));
  printf("字符型指针长度:%d\n",sizeof(a8));
  printf("结构的长度:%d\n",sizeof(a9));
  printf("结构的长度:%d\n",sizeof(a10));
  printf("结构的长度:%d\n",sizeof(a11));
  printf("结构的长度:%d\n",sizeof(a12));
  return 1;
} 
参阅sizeof用法 <a href="http://www.maomao365.com/?p=2809" target="_blank">http://www.maomao365.com/?p=2809</a>
  • 打赏
  • 举报
回复
结构对齐,简单的说就是取int的倍数。昨天刚学的,解释不好大神不要见怪。
lkjasdf9909 2015-09-20
  • 打赏
  • 举报
回复
结构体对齐的问题
动力风暴 2015-09-20
  • 打赏
  • 举报
回复
引用 4 楼 walkiz 的回复:
结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)
struct node{
	int a;
	char b;
    unsigned short k[3];
    unsigned int q;
}test1;
#pragma pack(pop)
[quote=引用 楼主 a904235765 的回复:] 定义一个如下的结构体: struct node{ int a; char b; unsigned short k[3]; unsigned int q; }test1; int a; a=sizeof(test1); 请问a的数值怎么是16,不是4+1+3*2+4=15么??
[/quote] 请教一下,一般情况都是结构体字节对齐,在什么情况下使用这种字节紧凑排列呢????
linux_hsylar 2015-09-20
  • 打赏
  • 举报
回复
结构体对齐方面的知识
宋寒松 2015-09-20
  • 打赏
  • 举报
回复
比如你用结构体去读取一个文件头,不紧凑的话中间会有很多字段对应不上。
引用 5 楼 adusuccessfully 的回复:
[quote=引用 4 楼 walkiz 的回复:] 结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)
struct node{
	int a;
	char b;
    unsigned short k[3];
    unsigned int q;
}test1;
#pragma pack(pop)
[quote=引用 楼主 a904235765 的回复:] 定义一个如下的结构体: struct node{ int a; char b; unsigned short k[3]; unsigned int q; }test1; int a; a=sizeof(test1); 请问a的数值怎么是16,不是4+1+3*2+4=15么??
[/quote] 请教一下,一般情况都是结构体字节对齐,在什么情况下使用这种字节紧凑排列呢????[/quote]
宋寒松 2015-09-19
  • 打赏
  • 举报
回复
结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)
struct node{
	int a;
	char b;
    unsigned short k[3];
    unsigned int q;
}test1;
#pragma pack(pop)
引用 楼主 a904235765 的回复:
定义一个如下的结构体: struct node{ int a; char b; unsigned short k[3]; unsigned int q; }test1; int a; a=sizeof(test1); 请问a的数值怎么是16,不是4+1+3*2+4=15么??
苏叔叔 2015-09-19
  • 打赏
  • 举报
回复
使用sizeof获取类型的字节大小,至于字节对齐问题,知道即可。
softee 2015-09-19
  • 打赏
  • 举报
回复
CPU访问内存的时候,对访问地址有对齐的要求,一般为2的幂次方。 所以有的数据结构被自动填充,以满足对齐要求。
Evankaka 2015-09-19
  • 打赏
  • 举报
回复
字节对齐,自动填充成2的幂次方数,这样计算机操作数据会更加快

69,382

社区成员

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

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