今天碰到局部变量的生命期、存放位置等问题,于是查了一下资料并在windows和Linux下以相同的代码验证一些想法。
切记切记,堆栈不是同一样东东,栈和堆都属于动态存储区的,栈存放函数的返回地址、参数和局部变量。
各类段在内存中分配的位置跟硬件架构和操作系统都有关系,x86架构即(大多数人用的window就是X86架构)中栈是由高地址向低地址分配,堆是由低地址向高地址分配,而在 Linux 中堆和栈的位置都分别与X86架构相反,下面会以栈为例子。另外存放静态数据、代码的区域位置也有一些不同。
#include <stdio.h>
void fun(void)
{
int a;
int b;
a=12;
b=13;
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("a_addr=0x%x\n",(unsigned int)&a);
printf("b_addr=0x%x\n",(unsigned int)&b);
}
void main(void)
{
fun();
while(1);
}
以上是验证代码。
Linux下的结果:
a=12 b=13
a=0xbfd2b328 b=0xbfd2b32c
windows下VC的结果:
a=12 b=13
a=0x12fef0 b=0x12feec
通过对比,显然得知:x86架构中栈是由高地址向低地址分配,而Linux中是相反的。