==== 一个很奇怪的问题====

error0 2002-04-16 04:09:43

// unsigned char 占 1 个字节
// unsigned short 占 2 个字节
// unsigned long 占 4 个字节
// 结构 arpPacket 应该是 42 个字节
// 而运行的结果却是给 arpPacket 分配了 44 个字节的内存
// 是成员 arp_tha[6] 这个数组分配了 8 个字节的内存
// 为什么 ???

#include <stdio.h>

typedef struct arpPacket
{
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;

unsigned short arp_hrd;
unsigned short arp_pro;
unsigned char arp_hln;
unsigned char arp_pln;
unsigned short arp_op;

unsigned char arp_sha[6];
unsigned long arp_spa;
unsigned char arp_tha[6];
unsigned long arp_tpa;

} ARPPACKET, *PARPPACKET;

void main()
{
ARPPACKET ARPPacket;

printf("%d \n", sizeof(ARPPacket));

printf("PA:%p\n\n", &ARPPacket);
printf("P1:%p\n", &ARPPacket.eh_dst);
printf("P2:%p\n", &ARPPacket.eh_src);
printf("P3:%p\n\n", &ARPPacket.eh_type);
printf("P4:%p\n", &ARPPacket.arp_hrd);
printf("P5:%p\n", &ARPPacket.arp_pro);
printf("P6:%p\n", &ARPPacket.arp_hln);
printf("P7:%p\n", &ARPPacket.arp_pln);
printf("P8:%p\n\n", &ARPPacket.arp_op);
printf("P9:%p\n", &ARPPacket.arp_sha);
printf("Pa:%p\n", &ARPPacket.arp_spa);
printf("Pb:%p\n", &ARPPacket.arp_tha);
printf("Pc:%p\n", &ARPPacket.arp_tpa);
getchar();
}
...全文
28 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wiler 2002-04-16
  • 打赏
  • 举报
回复
请注意define的顺序
fjhnuaa 2002-04-16
  • 打赏
  • 举报
回复
简单,我们这都懂!
fjhnuaa 2002-04-16
  • 打赏
  • 举报
回复
呵呵,给人先说了。对齐原则:long 从4的倍数放!
despird 2002-04-16
  • 打赏
  • 举报
回复
如果最后一个成员是unsighed short(2Byte),就不会有这种情况。
zz3075 2002-04-16
  • 打赏
  • 举报
回复
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;

unsigned short arp_hrd;
unsigned short arp_pro;
unsigned char arp_hln;
unsigned char arp_pln;
unsigned short arp_op;

unsigned char arp_sha[6];
到这一步刚好占了28个字节,刚好与最长的long型对齐了。而下面的unsigned char arp_tha[6];占六个字节,必须再加两个字节和下面的long 型数据对齐。这就是结构中的各类型变量的对齐原则。
alexzhou 2002-04-16
  • 打赏
  • 举报
回复
明白了,我也学了一点
despird 2002-04-16
  • 打赏
  • 举报
回复
还是六个,只是没有连续存储,如果把
unsigned char arp_tha[6];
unsigned long arp_tpa;
调换一下应该可以了吧。
error0 2002-04-16
  • 打赏
  • 举报
回复
送分了,回复就得分!!!
error0 2002-04-16
  • 打赏
  • 举报
回复
呵呵,原来是个空洞.

结构在内存中不一定连续,如果成员从字的边界开始存放就会有一个字节的空洞.在32位机上就是一个字节以上的空洞了.

唉,我太浅薄了.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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