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

C语言内存变量存储疑问:为何第二段代码中x指针比y高6字节?

C语言指针地址偏移与内存对齐问题

第一段代码

#include <stdio.h> 

int main() {
    short int x = 2;
    short int* px = &x;
    short int y = 3;
    short int* py = &y;
    
    printf("px\t%p\n", px);
    printf("px+1\t%p\n\n", px+1);
        
    printf("py\t%p\n", py);
    printf("py+1\t%p\n\n", py+1);
    
    return 0;
}

输出示例:

px      0061FF16
px+1    0061FF18
py      0061FF14
py+1    0061FF16

第二段代码

#include <stdio.h> 

int main() {
    short int x = 2;
    short int* px = &x;
    int y = 3;
    int* py = &y;
    
    printf("px\t%p\n", px);
    printf("px+1\t%p\n\n", px+1);
        
    printf("py\t%p\n", py);
    printf("py+1\t%p\n\n", py+1);
    
    return 0;
}

输出结果:

px      0061FF16
px+1    0061FF18
py      0061FF10
py+1    0061FF14

问题

为何第二段代码中x的指针地址比y高6字节而非4字节?


解答

这是内存对齐规则与编译器栈布局共同作用的结果:

在你的32位编译环境中:

  • short int类型占2字节,对齐要求为2字节(起始地址是偶数即可)
  • int和指针类型均占4字节,对齐要求为4字节(起始地址必须是4的整数倍)

第二段代码的局部变量包括x(short)、px(指针)、y(int)、py(指针),栈内存通常从高地址向低地址分配变量。

从输出可见:

  • x的地址是0061FF16,占用0061FF16和0061FF17两个字节
  • y作为int类型,必须满足4字节对齐要求,它的起始地址需要是4的倍数。如果直接紧随x的低地址分配,无法满足对齐规则,因此编译器在x的下方插入了2字节的填充空间,最终将y的起始地址安排在0061FF10(符合4字节对齐)。

两者地址差为0061FF16 - 0061FF10 = 6字节,这个差值本质是对齐规则要求的填充字节导致的,而非变量本身的大小叠加。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:35:01