我有一个小C程序:
#include<stdio.h>
void getInput();
void what();
int main()
{
getInput();
}
void getInput()
{
char buffer[6];
gets(buffer);
puts(buffer);
}
void what()
{
printf("What!! No one called me!!\n");
}
当在GDB中调试时,我得到(我没有包含函数的代码what()):
0x5555555546f0 <main> push %rbp │
│0x5555555546f1 <main+1> mov %rsp,%rbp │
│0x5555555546f4 <main+4> mov $0x0,%eax │
│0x5555555546f9 <main+9> callq 0x555555554705 <getInput> │
│0x5555555546fe <main+14> mov $0x0,%eax │
│0x555555554703 <main+19> pop %rbp │
│0x555555554704 <main+20> retq
|0x555555554705 <getInput> push %rbp │
│0x555555554706 <getInput+1> mov %rsp,%rbp │
│0x555555554709 <getInput+4> sub $0x10,%rsp │
>│0x55555555470d <getInput+8> lea -0x6(%rbp),%rax │
│0x555555554711 <getInput+12> mov %rax,%rdi │
│0x555555554714 <getInput+15> mov $0x0,%eax │
│0x555555554719 <getInput+20> callq 0x5555555545a0 <gets@plt> │
│0x55555555471e <getInput+25> lea -0x6(%rbp),%rax │
│0x555555554722 <getInput+29> mov %rax,%rdi │
│0x555555554725 <getInput+32> callq 0x555555554590 <puts@plt> │
│0x55555555472a <getInput+37> nop │
│0x55555555472b <getInput+38> leaveq │
│0x55555555472c <getInput+39> retq
我相信sub $0x10,%rsp
中的getInput()
用于通过使堆栈指针指向远离其当前位置的16个字节来将内存分配到堆栈中。我想知道为什么编译器在堆栈上分配了16个字节的内存,而C代码只要求6个字节?我知道下一条指令lea -0x6(%rbp),%rax
允许用户只使用6个字节的内存,但为什么我们只分配16个呢?