数组c语言下标,关于C语言数组下标问题

  • Post author:
  • Post category:其他


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