亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于C語言數組下標問題

關于C語言數組下標問題

Cats萌萌 2019-11-03 15:49:18
intarr[]={0,12,1,23,65,1,3,99,78};printf("%d\n",arr[-1]);for(inti=0;i
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

越界了,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的輸出
//code
inta[]={1,2,3,4,5,6,7,8,9};
inti=2;
//gdb
p&i
(int*)$1=0x00007ffeefbffdc8
x/11dw0x00007ffeefbffdc8
0x7ffeefbffdc8:2
0x7ffeefbffdcc:0
0x7ffeefbffdd0:1
0x7ffeefbffdd4:2
0x7ffeefbffdd8:3
0x7ffeefbffddc:4
0x7ffeefbffde0:5
0x7ffeefbffde4:6
0x7ffeefbffde8:7
0x7ffeefbffdec:8
0x7ffeefbffdf0:9
                            
查看完整回答
反對 回復 2019-11-03
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

下標越界。
向后越界(比0還?。┲赶虻臀恢羔樀刂?,向前越界(比數組長度還大)指向高位指針地址。如果指向的地址沒被使用,也就是個野地址,那么結果就是是隨機的,無意義。
這個代碼段里第一個arr[-1]指向什么還得看上下文,不同的上下文結果不一定都是32689;for循環里的arr[-1]指向i了。
這種黑魔法少用,基本沒有可讀性。
                            
查看完整回答
反對 回復 2019-11-03
  • 2 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號