You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char _Alignas(double)变量地址间隔为何不是8字节

问题解答

核心原因

这个差值是栈的增长方向+对齐规则+变量本身大小共同作用的结果,和sizeof(double)没有直接关系,具体逻辑如下:

  • x86_64架构的栈默认从高地址向低地址分配空间,先声明的局部变量会被分配到更高的栈地址
  • _Alignas(double)仅约束变量的起始地址必须满足double的对齐要求(即地址是8的整数倍),不会改变变量本身的类型和大小:c2的类型依然是char,大小仅为1字节
  • 两个地址的差值是高地址减 低地址的结果,不代表低地址变量的占用大小

逐位推导你的运行结果

你的输出中:

  • 先声明的c1地址为0x61FE1F(高地址),占用这1个字节的空间
  • 接下来分配c2时,需要从低于0x61FE1F的地址中,找到第一个满足8字节对齐的地址,计算可得就是0x61FE18(0x61FE18 % 8 = 0,符合对齐规则)
  • 两者地址差为 0x61FE1F - 0x61FE18 = 7,中间的0x61FE19到0x61FE1E共6个字节是编译器自动插入的对齐填充位,加上c2本身占的1字节,刚好凑够7字节的差值。

验证方法

你可以额外打印sizeof(c2),输出结果会是1而非8,就能确认_Alignas没有修改变量本身的大小,仅约束了起始地址的对齐规则。如果把两个变量的声明顺序调换(先声明c2再声明c1),你会看到两者的地址差变为1,进一步验证栈分配的逻辑。


内容的提问来源于stack exchange,提问作者Hongyuan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:54:02