param2, int param3) { int val1 = param1; int val2 = param2; int val3 = param3; printf("¶m1:0x%08x\n", ¶m1); printf("¶m2:0x%08x\n", ¶m2); printf("¶m3:0x%08x\n", ¶m3); 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。
按照《程序员面试宝典》中所讲的,其堆栈分布应如下图所示:
为了弄明白怎么回事,我看了程序编译的汇编语言,可是由于才疏学浅还是没有搞懂!现在请教一下,请知道的同志给以解答,谢谢!
int4个字节,栈上。
请再详细点
在Visual Studio 进行程序调试时发现连续两个整形数据的内存分配很是诡异,地址之间相差了12个字节,如下图:
但在VC++6.0中是相差4个字节呀!经过研究发现是和VS的解决方案配置有关,上述结果是默认采用Debug模式下得到的,通过修改VS的解决方案配置为 Release 模式,再重新运行原来的程序就会发现连续定义的两个int型数据内存还是连续分配的,地址相差4个字节:
并且发现,在Debug模式下面,内存是有大地址向小地址方向进行内存分配(即先定义的int数据的地址比后定义的int 数据地址大);
而在Release模式下面,内存是由小地址向大地址方向进行内存分配(即先定义的int数据的地址比后定义的int 数据地址小)。