2015-10-07 17 views
0

所有在我的课本秀缓冲阵列的例子问题被存储在堆栈,当返回地址改写这个导致问题。但是,缓冲区总是处于堆栈状态?我认为一个数组将被写入内存中的其他地方,而不是堆栈。缓冲区字符数组是否始终存储在堆栈中?

+0

欢迎来到IS堆栈交换。一些更多的信息是有用的,比如你使用的是什么编程语言,因为不同的语言甚至不同的编译器可能会以不同的方式处理数组中变量的存储。 –

回答

0

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

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

即使它们随后被传递到可变将保持存储在栈上的函数。距执行功能更远。

如果你一个缓冲,然后它会被保存在堆内存而不是在栈上分配内存。

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

这是当heap spraying可开采成为必要。你看到堆栈中大多数缓冲区溢出的原因是因为它是开始理解开发概念的最简单方法。

1

缓冲器阵列通常存储在栈上。但是,将它们存储在堆或固定的内存位置是非常有可能的 - 这就是假设你正在处理区分堆栈和堆的语言(和体系结构)。

1

这主要取决于编译器,你的缓冲声明和函数的调用方式。

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

一些语言和编译器将以不同的方式分配这些。例如,在Delphi中,你是否声明了一个类型为“string”的局部变量,实际的数据将被存储在堆上,只有一个指针被分配给堆栈。

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