c语言中怎么数结构体字节长,结构体字节长度计算解决方法

本文探讨了C语言中结构体字节长度计算的问题,解释了为什么在某些情况下,结构体的总字节数并非各成员字节数之和。重点介绍了结构体的字节对齐原则,并提供了使用`#pragma pack`指令来控制字节对齐的示例,以实现紧凑排列。结构体字节对齐通常用于优化内存访问效率,但在特定场景如文件头解析时,可能需要紧凑排列以确保字段对应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体字节长度计算

定义一个如下的结构体:

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么??

------解决思路----------------------

使用sizeof获取类型的字节大小,至于字节对齐问题,知道即可。

------解决思路----------------------

结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)

struct node{

int a;

char b;

unsigned short k[3];

unsigned int q;

}test1;

#pragma pack(pop)

引用:定义一个如下的结构体:

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么??

------解决思路----------------------

引用:结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)

struct node{

int a;

char b;

unsigned short k[3];

unsigned int q;

}test1;

#pragma pack(pop)

Quote: 引用:定义一个如下的结构体:

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: 引用:结构体会有字节对齐问题,如果你想让它紧凑的排列,那么可以这样:

#pragma pack(push, 1)

struct node{

int a;

char b;

unsigned short k[3];

unsigned int q;

}test1;

#pragma pack(pop)

Quote: 引用:定义一个如下的结构体:

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么??

请教一下,一般情况都是结构体字节对齐,在什么情况下使用这种字节紧凑排列呢????

------解决思路----------------------

仅供参考:#include 

#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

//

//

------解决思路----------------------

在结构体中,结构体的长度等于所有类型长度的合计,

并且必须等于其中占用内存长度最大的成员项的整数倍。

#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用法   http://www.maomao365.com/?p=2809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值