缓冲区字符数组是否始终存储在堆栈中?

Is a buffer char array always stored in stack?

我教科书中的所有示例问题都显示缓冲区数组存储在堆栈中,这会在 return 地址被覆盖时导致问题。但是,缓冲区总是在堆栈中吗?我假设一个数组会写在内存中的其他地方而不是堆栈中。

缓冲区数组通常存储在堆栈中。但是,很有可能将它们存储在堆上或固定的内存位置——这一切都假设您正在处理一种区分堆栈和堆的语言(和体系结构)。

这主要取决于编译器、声明缓冲的位置以及调用函数的方式。

在C中,一般来说,局部变量以及提供给函数调用的一些参数(在cdecl调用约定中*。其他调用约定可能会通过寄存器压入一些参数或甚至在某些情况下通过透明的堆分配)。

一些语言和编译器会以不同方式分配这些。比如在Delphi中,你声明了一个"string"类型的局部变量,实际的数据会存储在堆上,只分配一个指针到栈上。

最后,程序员总是可以决定在堆(或全局内存)上显式分配缓冲区。

声明为常量大小(参见下面的示例)或立即初始化的局部变量缓冲区存储在堆栈中。

char x[20];char x[] = "this buffer";

即使随后将它们传递给函数,该变量仍将存储在堆栈中。离执行的功能更远。

如果为缓冲区分配内存,那么它将存储在堆内存中而不是堆栈中。

char *x = (char *) malloc(LENGTH_OF_BUFFER);

此时 heap spraying 可能成为利用的必要条件。您在堆栈上看到大多数示例缓冲区溢出的原因是因为它是开始理解利用概念的最简单方法。