MacOS(M3芯片)下C语言程序出现9位十六进制内存地址的疑问
MacOS(M3芯片)下C语言程序出现9位十六进制内存地址的疑问
嗨,我来帮你理清楚这个困惑~
首先,先看你给出的运行结果,其实你的内存地址依然符合对齐要求,只是显示的十六进制位数看起来是奇数而已,咱们一步步说:
关于地址的对齐问题
你之前在Win10上看到地址都是2的倍数,其实更准确的是4的倍数——因为int类型通常占4字节,编译器会把int变量放在4字节对齐的地址上(这样CPU访问效率更高)。看你Mac上的输出:
m的地址:0x16fa13228→ 最后一位是8,是4的倍数n的地址:0x16fa13224→ 最后一位是4,是4的倍数o的地址:0x16fa13220→ 最后一位是0,是4的倍数z(指针变量)的地址:0x16fa13218→ 最后一位是8,同样是4的倍数
所以本质上,Mac上的内存对齐规则和Win10是一致的,并没有违背你之前的认知,只是显示的地址长度看起来不一样。
为什么是9位十六进制地址?
这是因为你的M3芯片属于ARM64架构,MacOS在Apple Silicon设备上使用了指针压缩技术。64位的指针其实不需要用到全部64位,系统会把高位的一些位做标记或者直接忽略,只使用低36位左右的空间来表示用户空间的地址。所以printf用%p输出时,就会显示成9位十六进制数字(每一位十六进制对应4个二进制位,9*4=36),看起来位数是奇数,但这只是显示形式的问题,实际的指针在底层还是64位的。
简单来说,地址的十六进制位数奇偶只是数值长度的表现,和地址是否合法、是否符合对齐规则没有关系,你不用因为位数是奇数就担心哪里出错啦~
备注:内容来源于stack exchange,提问作者Mert KİREMİTCİ
相关产品推荐
相关产品推荐

