首页 > 解决方案 > 在 C 中声明数组时如何将其放在堆栈上?

问题描述

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

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

我知道堆栈将如下所示:

4 字节 a、8 字节 b、8 字节 c

但如果代码改为:

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

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

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

标签: cstackoverflowbuffer-overflow

解决方案


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

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

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


推荐阅读