我们在之前的文章《函数在内存中是怎样表示的?》多次提到过,每个函数在运行起来后都有属于自己的栈帧,栈帧组成栈区,此时arr_on_stack这个函数的栈区在哪里呢?答案就在寄存器rbp中。 我们来看一下rbp寄存器指向了哪里? (gdb) p $rbp
$3 = (void *) 0x7ffffffee2a0
啊哈,原来栈帧在0x7ffffffee2a0这个地方,那么我们的数组arr在哪里呢?别着急,这条指令会告诉我们答案: 0x000000000040052a <+4>: movl $0x64,-0x20(%rbp)
这行指令的含义是说把100(0x64)放到rbp寄存器减去0x20的地方,显然这就是数组的开头,让我们来计算一下rbp寄存器减去0x20: 0x7ffffffee2a0(%rbp) - 0x20 = 0x7ffffffee280
因此,我们预测arr应该在0x7ffffffee280这个位置上。 接下来我们用gdb验证一下: (gdb) p &arr
$2 = (int (*)[6]) 0x7ffffffee280
哈哈,怎么样,是不是和我们猜想的一样,数组arr的确就放在了0x7ffffffee280这个位置,是这样存储的:
这就是C语言中所谓的数组了,无非就是从0x7ffffffee280 到 0x7ffffffee298这一段内存嘛,数组在栈区就是这么表示的!
|