天天看點

C語言字母為下标數組下标,關于C語言數組下标問題

越界了,undefined behavior。

你這個代碼中,都是在棧上配置設定的,棧是高位往低位擴張,一開始棧的布局是這樣的

a9

a8

a7

a6

a5

a4

a3

a2

a1

a0

每次loop,會在低位申請然後又釋放i,棧的布局:

a9

a8

a7

a6

a5

a4

a3

a2

a1

a0

i

這種情況下arr[-1]就會一直輸出i

這裡有個小問題, 我在wsl上試着是4個位元組, 而在mac是兩個位元組, 但mac上的整型也是4個位元組, 不知道為什麼這兒就變成兩個位元組了)

我猜你計算2和4是代碼裡面輸出兩個位址相減的值的。

你的wsl應該是預設編譯出32位的程式,直接減得到4沒問題。

mac上編譯出來的是64位的,你直接減,然後輸出的時候應該是溢出了,得到個2,你試試先把位址轉long long,用%lld輸出試試,會得到一個8,而不是2或者4。

這是因為配置設定空間的時候還會做記憶體對齊,配置設定i的時候會再跳過高位的4個位元組再去配置設定i,保證i的位址也是8的倍數,是以實際位址差是8,64位的程式堆結構大概如下:

0 a8

a7 a6

a5 a4

a3 a2

a1 a0

0 i

貼一個gdb的輸出

// code

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int i = 2;

// gdb

p &i

(int *) $1 = 0x00007ffeefbffdc8

x/11dw 0x00007ffeefbffdc8

0x7ffeefbffdc8: 2

0x7ffeefbffdcc: 0

0x7ffeefbffdd0: 1

0x7ffeefbffdd4: 2

0x7ffeefbffdd8: 3

0x7ffeefbffddc: 4

0x7ffeefbffde0: 5

0x7ffeefbffde4: 6

0x7ffeefbffde8: 7

0x7ffeefbffdec: 8

0x7ffeefbffdf0: 9