缥缈止盈
越界了,undefinedbehavior。你这个代码中,都是在栈上分配的,栈是高位往低位扩张,一开始栈的布局是这样的a9a8a7a6a5a4a3a2a1a0每次loop,会在低位申请然后又释放i,栈的布局:a9a8a7a6a5a4a3a2a1a0i这种情况下arr[-1]就会一直输出i这里有个小问题,我在wsl上试着是4个字节,而在mac是两个字节,但mac上的整型也是4个字节,不知道为什么这儿就变成两个字节了)我猜你计算2和4是代码里面输出两个地址相减的值的。你的wsl应该是默认编译出32位的程序,直接减得到4没问题。mac上编译出来的是64位的,你直接减,然后输出的时候应该是溢出了,得到个2,你试试先把地址转longlong,用%lld输出试试,会得到一个8,而不是2或者4。这是因为分配空间的时候还会做内存对齐,分配i的时候会再跳过高位的4个字节再去分配i,保证i的地址也是8的倍数,所以实际地址差是8,64位的程序堆结构大概如下:0a8a7a6a5a4a3a2a1a00i贴一个gdb的输出//codeinta[]={1,2,3,4,5,6,7,8,9};inti=2;//gdbp&i(int*)$1=0x00007ffeefbffdc8x/11dw0x00007ffeefbffdc80x7ffeefbffdc8:20x7ffeefbffdcc:00x7ffeefbffdd0:10x7ffeefbffdd4:20x7ffeefbffdd8:30x7ffeefbffddc:40x7ffeefbffde0:50x7ffeefbffde4:60x7ffeefbffde8:70x7ffeefbffdec:80x7ffeefbffdf0:9