C中声明数组时,数组是如何入栈的?

How is an array placed on the stack when it is declared in C?

为了了解缓冲区溢出漏洞,我正在寻找有关声明数组时堆栈实际外观的说明。对于以下代码:

int main()
{
    int a = 0;
    char b[8];
    char c[8];

我知道堆栈看起来像:

4 bytes a, 8 bytes b, 8 bytes c

但是如果代码是:

int main()
{
    int a = 0;
    int b[8];
    char c[8]

堆栈是什么样子的?我认为它将是 4 个字节 a,然后是 32 (8*4) 个字节 b,然后是 8 个字节用于 c。但是,我不完全确定此时索引将如何工作(是 b[0] 最接近 a 还是 b[7]?)。

任何澄清都会有所帮助,谢谢!

首先,您可能不会假设在将变量放入堆栈时会使用任何特定的顺序。编译器可以选择序列。使用优化时经常会发生这种情况。在这种情况下,编译器可能不会在堆栈上分配 space,直到第一次引用变量。

此外,如果变量是短暂的,编译器可能会选择根本不使用堆栈,并且可能会将变量存储在 CPU 寄存器中。

至于需要多少内存,这取决于系统。一些系统可能允许一次分配 8 位。某些系统可能会强制所有内容都为 32 位宽度。某些系统可能会添加填充以确保较大宽度的变量正确对齐。