C为堆栈分配堆栈空间大小

Jan*_*ter 2 c assembly gdb

我有一个名为demo.c的简单程序,它为堆栈上长度为8的char数组分配空间

#include<stdio.h>


main()
{
        char buffer[8];

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为将从堆栈为8个字符分配8个字节,但如果我在gdb中检查这个,则从堆栈中减去10个字节.

我在我的Ubuntu 32位机器上用这个命令编译程序:

$ gcc -ggdb -o demo demo.c

然后我用以下方法分析程序:

$ gdb演示

$ disassemble main

(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 <__stack_chk_fail@plt>
   0x08048430 <+44>:    leave  
   0x08048431 <+45>:    ret    
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

0x0804840a <+6>:sub $ 0x10,%esp说,堆栈分配了10个字节对吗?

为什么分配10个字节而不是8个?

unw*_*ind 5

不,0x10意味着它是十六进制的,即10 16,十进制是16 10字节.

可能是由于堆栈的对齐要求.