关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结

本文介绍了在C语言中,结构体和共用体的字节对齐问题,通过实例解析了如何快速计算它们占用的字节数。在不同平台下,由于字节对齐规则不同,可能导致同样结构体占用字节数的差异,从而影响数据传输和存储。文章总结了计算方法,并强调了字节对齐对CPU快速访问数据的重要性。
摘要由CSDN通过智能技术生成

前几天在做项目时,出现了一个套接字通信的一个问题,看似客户端和服务器端使用的一个相同的结构体,但是就是在服务器端不能把客户端发送的数据全部显示的打印出来。查找了好久的错误,才发现原来两端的结构体看似相同,但其两端结构体占用的字节数是不一样的。才导致了服务器端不能正常的显示出全部内容。

大概情况是这样的,client端定义结构体如下:

typedef  struct _u64{
    long high;
    long low;

}U64;
struct _data_pack{
    int a;
    int b;
    union snmp_data{
   
       long     name;
       U64  	buf1;
       char 	buf2[100];
   }snmp_data_t;

}data_pack_t;
client 这端发送 sizeof(data_pack_t) 的字节到服务端。

服务端定义如下:

typedef unsigned long long U64;
struct _data_pack{
    int a;
    int b;
    union snmp_data{
   
       long 	name;
       U64  	buf1;
       char 	buf2[100];
    }snmp_data_t;

}data_pack_t;

struct data5{

		char c1;
		char c2[2];
};

服务端也接受sizeof(data_pack_t)这么多的字节数。

问题出现了,服务端这边不能不能把共用体中的数据显示的打印出来,查找原因,最后才发现原来两边的结构体大小占用的字节数是不一样的。

client端:sizeof(data_pack_t)= 108

service端:sizeof(data_pack_t)= 112

为此,本人在网上查找了大量有关字节对齐的资料,总结了自己认为快速计算结构体 共用体字节大小的方法,现说明如下:

对于无论是 简单类型的变量 还是结构类型的变量 ,联合类型的变量,在内存中的存储都要按照字节对齐的方式存储。这样存储的主要的目的是能让cpu快速的访问数据。

说到字节对齐,这里有几个重要的概念需要深刻理解 ,记忆:

一 :什么是字节对齐

     就是变量存储的地址是变量的有效字节对齐值的整数倍,即:

     address%最终有效字节对齐值 = 0;

二:关于几种字节对齐值的说明

1 变量的自身字节对齐值

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值