首页 新闻 会员 周边

关于函数调用中堆栈中临时变量存储问题

0
悬赏园豆:20 [已关闭问题] 关闭于 2016-05-13 18:51

param2, int param3)
{
    int val1 = param1;
    int val2 = param2;
    int val3 = param3;
    printf("&param1:0x%08x\n", &param1);
    printf("&param2:0x%08x\n", &param2);
    printf("&param3:0x%08x\n", &param3);
    printf("&val1:0x%08x\n", &val1);
    printf("&val2:0x%08x\n", &val2);
    printf("&val3:0x%08x\n", &val3);
}

void main()
{
    func(1, 2, 3);
}

上述代码的运行结果如下:

结果如图所示,在栈的存储param1~param2的地址都是连续的,但是对于val1~val3为什么都相差12。

按照《程序员面试宝典》中所讲的,其堆栈分布应如下图所示:

为了弄明白怎么回事,我看了程序编译的汇编语言,可是由于才疏学浅还是没有搞懂!现在请教一下,请知道的同志给以解答,谢谢!

RunningSnail的主页 RunningSnail | 初学一级 | 园豆:193
提问于:2016-05-12 16:26
< >
分享
所有回答(2)
0

int4个字节,栈上。

Daniel Cai | 园豆:10424 (专家六级) | 2016-05-12 17:25

请再详细点

支持(0) 反对(0) RunningSnail | 园豆:193 (初学一级) | 2016-05-12 22:02
0

在Visual Studio 进行程序调试时发现连续两个整形数据的内存分配很是诡异,地址之间相差了12个字节,如下图:

\

但在VC++6.0中是相差4个字节呀!经过研究发现是和VS的解决方案配置有关,上述结果是默认采用Debug模式下得到的,通过修改VS的解决方案配置为 Release 模式,再重新运行原来的程序就会发现连续定义的两个int型数据内存还是连续分配的,地址相差4个字节:

\

并且发现,在Debug模式下面,内存是有大地址向小地址方向进行内存分配(即先定义的int数据的地址比后定义的int 数据地址大);

                而在Release模式下面,内存是由小地址向大地址方向进行内存分配(即先定义的int数据的地址比后定义的int 数据地址小)。

RunningSnail | 园豆:193 (初学一级) | 2016-05-13 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册