我正在尝试反汇编此代码:
int main()
{
int arr[5] = {1,2,3,4,5};
int i;
for(i=0;i<5;i++)
{
printf("Element:%d\n",arr[i]);
}
return 0;
}
IDA 输出: sub esp, 30h
问:是什么意思?我以为会是18h(5x4+4)
我正在尝试反汇编此代码:
int main()
{
int arr[5] = {1,2,3,4,5};
int i;
for(i=0;i<5;i++)
{
printf("Element:%d\n",arr[i]);
}
return 0;
}
IDA 输出: sub esp, 30h
问:是什么意思?我以为会是18h(5x4+4)
看起来您是在 amd64 下编译的(很可能在 2016 年;)。编译器分配所有堆栈内存(但不仅如此,函数参数也相同)对齐到 8 位。您假设 int 是 32 位,在您的机器上它可能是 32 位,但编译器仍然会分配 8 个字节(64 位)。所以 5*8+8=48 = 0x30。
尝试分配一个包含五个字符的数组(又名 uint8_t)。编译器仍将分配 8 个字节 * 元素数。
阅读有关属性打包 (gcc) 或编译指示包 (Windows) 的信息。