예를 들어 다음과 같은 함수를 테스트하는 경우,
void func(void)
{
char buf1[3];
}
x86 기반의 linux 2.6에서 gcc로 컴파일한다면, 제 상식으로는 buf1을 위해서 로칼 스택에 4바이트가 할당될 것이라 생각했습니다. 그런데 gdb로 확인하면
(gdb) disassem func
Dump of assembler code for function func:
0x8048460 <func>: push %ebp
0x8048461 <func+1>: mov %esp,%ebp
0x8048463 <func+3>: sub $0x18,%esp
0x8048466 <func+6>: leave
0x8048467 <func+7>: ret
보다시피 컴파일러는 buf1을 위해서 24바이트(18h) 스택 공간을 할당하는 것을 볼 수 있습니다. 그런데 buf1[4]로 하면 4바이트가 할당이 되더군요. 그리고 buf1[5]로 하면 다시 24바이트가 할당이 됩니다.