读书人

程序栈空间的内存分布有关问题

发布时间: 2013-04-21 21:18:07 作者: rapoo

程序栈空间的内存分布问题
一个很简单的程序

int _tmain(int argc, _TCHAR* argv[])
{
int a=1;
int b=2;
int c=3;
printf("%x %x %x %x %x\n",&argv,&argc,&a,&b,&c);

int *pa=new int;
int *pb=new int;
int *pc=new int;
printf("%x %x %x\n",pa,pb,pc);
return 0;
}

}
某次的输出结果是
int _tmain(int argc, _TCHAR* argv[])
{
int a=1;
int b=2;
int c=3;
printf("%x %x %x %x %x\n",&argv,&argc,&a,&b,&c);

return 0;
}
某次的输出结果是:1cf998 1cf994 1cf984 1cf978 1cf96c
可以看出,栈的地址是从高地址开始的。而参数压栈是从右到左的。
虽然每次的输出结果都不同,但是a,b,c这三个栈上的数据的地址相互间差了0xc。argv和argc的地址相差了了0x4,argc和a的地址相差为0x10(十六进制)。
int类型为占据四个字节。TCHAR占据一个或是两个字节。但这些地址值之间的差距却没有显示这样的结果。却请问是为什么呢? 内存 栈 C
[解决办法]
用调试器看反汇编代码吧
[解决办法]

引用:
引用:%p 输出地址

用%p的输出结果和%x差不多呢。a,b,c这三个栈上的数据的地址相互间差了0xc。argv和argc的地址相差了了0x4,argc和a的地址相差为0x10(十六进制)。为什么会是这样的结果。。纠结了


考虑函数的返回地址,上一桢的ebp,安全cookie。a,b,c也可以不连续,这是编译器的自由。

你只需要知道大致的布局即可。
[解决办法]
release编译后运行

debug会插入一些测试代码

读书人网 >C++

热点推荐