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
相关产品推荐
相关产品推荐

