越界了,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