越界了,undefinedbehavior。你這個(gè)代碼中,都是在棧上分配的,棧是高位往低位擴(kuò)張,一開始棧的布局是這樣的a9a8a7a6a5a4a3a2a1a0每次loop,會(huì)在低位申請然后又釋放i,棧的布局:a9a8a7a6a5a4a3a2a1a0i這種情況下arr[-1]就會(huì)一直輸出i這里有個(gè)小問題,我在wsl上試著是4個(gè)字節(jié),而在mac是兩個(gè)字節(jié),但mac上的整型也是4個(gè)字節(jié),不知道為什么這兒就變成兩個(gè)字節(jié)了)我猜你計(jì)算2和4是代碼里面輸出兩個(gè)地址相減的值的。你的wsl應(yīng)該是默認(rèn)編譯出32位的程序,直接減得到4沒問題。mac上編譯出來的是64位的,你直接減,然后輸出的時(shí)候應(yīng)該是溢出了,得到個(gè)2,你試試先把地址轉(zhuǎn)longlong,用%lld輸出試試,會(huì)得到一個(gè)8,而不是2或者4。這是因?yàn)榉峙淇臻g的時(shí)候還會(huì)做內(nèi)存對(duì)齊,分配i的時(shí)候會(huì)再跳過高位的4個(gè)字節(jié)再去分配i,保證i的地址也是8的倍數(shù),所以實(shí)際地址差是8,64位的程序堆結(jié)構(gòu)大概如下:0a8a7a6a5a4a3a2a1a00i貼一個(gè)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