我有一个简单的程序称为demo.c其中用于一个字符阵列的8长度堆栈C对堆栈分配的空间大小的阵列
#include<stdio.h>
main()
{
char buffer[8];
return 0;
}
我认为8个字节将在分配空间从堆栈分配的八个字符,但如果我在gdb中检查,从堆栈中减去10个字节。
我用此命编译的程序我的Ubuntu 32位计算机上:
$ GCC -ggdb -o演示demo.c
然后我分析程序使用:
$ GDB演示
$拆卸主
(gdb) disassemble main
Dump of assembler code for function main:
0x08048404 <+0>: push %ebp
0x08048405 <+1>: mov %esp,%ebp
0x08048407 <+3>: and $0xfffffff0,%esp
0x0804840a <+6>: sub $0x10,%esp
0x0804840d <+9>: mov %gs:0x14,%eax
0x08048413 <+15>: mov %eax,0xc(%esp)
0x08048417 <+19>: xor %eax,%eax
0x08048419 <+21>: mov $0x0,%eax
0x0804841e <+26>: mov 0xc(%esp),%edx
0x08048422 <+30>: xor %gs:0x14,%edx
0x08048429 <+37>: je 0x8048430 <main+44>
0x0804842b <+39>: call 0x8048340 <[email protected]>
0x08048430 <+44>: leave
0x08048431 <+45>: ret
End of assembler dump.
0x0804840a < +6>:sub $ 0x10,%esp说,从堆栈中分配了10个字节吧?
为什么分配10个字节而不是8个?
编译器可以完全自由地分配更多的数据,或者,因为您不使用'buffer',因此不会分配任何东西。使用'buffer'来传递函数足以阻止优化。 –