栈内存布局疑问:结构体大小计算结果为负的原因
问题原因解析
你的核心误解在于默认认为局部变量的分配顺序和代码中的定义顺序完全一致,但实际上C语言标准并没有规定栈上局部变量的内存布局顺序,编译器有权根据自身策略调整变量的分配位置。
虽然栈的整体增长方向是从高地址向低地址(栈指针向低地址移动来分配新空间),但编译器处理局部变量时,不一定按照你写的obj1→obj2的顺序来分配内存。在你的测试中,编译器实际上先给obj2分配了更高的内存地址,然后才分配obj1的空间,所以(char*)&obj1 - (char*)&obj2得到的是负数,绝对值12正好是结构体Node的实际大小(因为内存对齐:int a占4字节,char b占1字节后补3字节对齐,int c占4字节,总和12)。
另外,这种通过两个变量地址差计算结构体大小的方法完全不可靠,不同编译器、甚至同一编译器的不同编译选项都可能改变变量的布局顺序,正确的做法还是使用标准的sizeof(Node)来获取结构体大小。
内容的提问来源于stack exchange,提问作者Gokulanandan S
相关产品推荐
相关产品推荐

