Memory 堆栈中的内存冲突

Memory 堆栈中的内存冲突,memory,stack,overflow,stack-overflow,Memory,Stack,Overflow,Stack Overflow,因此,当内存发生冲突时(以及本网站的标题),我理解堆栈溢出是什么,但我不理解的是,为什么堆栈中的新条目位于递减内存地址中。为什么它们不在一个随机的内存地址中,这样内存冲突就不会成为问题了,这不是更有意义吗?我猜这背后有某种优化的原因 **编辑** 我没有意识到的是,一个堆栈有x个地址空间。现在有道理了,但我要问一个后续问题。我可以明确地说明我要为堆栈分配多少内存吗?这个问题的答案可能很复杂,但基本上,堆栈操作被认为是非常原始的函数,处理器将其作为代码正常执行的一部分。(保存返回地址和其他内容。)

因此,当内存发生冲突时(以及本网站的标题),我理解堆栈溢出是什么,但我不理解的是,为什么堆栈中的新条目位于递减内存地址中。为什么它们不在一个随机的内存地址中,这样内存冲突就不会成为问题了,这不是更有意义吗?我猜这背后有某种优化的原因

**编辑**


我没有意识到的是,一个堆栈有x个地址空间。现在有道理了,但我要问一个后续问题。我可以明确地说明我要为堆栈分配多少内存吗?

这个问题的答案可能很复杂,但基本上,堆栈操作被认为是非常原始的函数,处理器将其作为代码正常执行的一部分。(保存返回地址和其他内容。)

那么内存管理代码放在哪里呢?您在哪里跟踪分配的地址或添加代码以分配新地址?实际上没有任何地方可以这样做,因为这些都是由处理器本身执行的基本操作


与保存代码本身的内存类似,堆栈假定是在代码运行之前设置的(并由堆栈寄存器指向)。实际上,没有任何地方可以将复杂的内存管理添加到堆栈内存中。因此,是的,如果没有提供足够的内存,堆栈将溢出。

这个问题的答案可能很复杂,但基本上堆栈操作被认为是非常原始的函数,处理器将其作为代码正常执行的一部分。(保存返回地址和其他内容。)

那么内存管理代码放在哪里呢?您在哪里跟踪分配的地址或添加代码以分配新地址?实际上没有任何地方可以这样做,因为这些都是由处理器本身执行的基本操作

与保存代码本身的内存类似,堆栈假定是在代码运行之前设置的(并由堆栈寄存器指向)。实际上,没有任何地方可以将复杂的内存管理添加到堆栈内存中。因此,是的,如果没有提供足够的内存,堆栈将溢出。

“内存冲突”更适合于“缓冲区溢出”一词,即在预定空间之外写入,但很可能位于不同的分配内存块中

堆栈溢出不是将内存分配之外的内容写入另一个内存分配。它只是关于在堆栈内存分配之外进行写操作。最有可能的是在堆栈之外有一个保护内存页,它没有分配任何内容,并且在读或写尝试时会导致错误

为堆栈上推送的每个值分配一个随机地址会使在堆栈上查找数据变得困难(而且它不再是堆栈)。当编译器或程序员知道后续元素占用后续地址时,只需从堆栈帧的基指针计算这些地址就很容易了。

“内存冲突”更适合于“缓冲区溢出”这一术语,即在预定空间外写入,但它可能位于不同的已分配内存块中

堆栈溢出不是将内存分配之外的内容写入另一个内存分配。它只是关于在堆栈内存分配之外进行写操作。最有可能的是在堆栈之外有一个保护内存页,它没有分配任何内容,并且在读或写尝试时会导致错误


为堆栈上推送的每个值分配一个随机地址会使在堆栈上查找数据变得困难(而且它不再是堆栈)。当编译器或程序员知道后续元素占用后续地址时,就很容易仅从堆栈帧的基指针计算这些地址。

堆栈溢出是指耗尽所有可用堆栈空间。在大多数情况下,堆栈的可用空间只是系统设计者选择的任意限制。改变这一点是可能的,但在现代系统上,这并不是一个真正的问题——需要几兆字节堆栈的代码,除非系统非常庞大,否则可能没有正确设计


堆栈从“custom”开始向零增长-它必须沿着定义的方向前进,否则很难跟踪正在发生的事情,较低的addAddress和较高的address一样好。过去的情况是堆栈和堆相互靠近,这将允许使用大量堆栈而不是堆的代码与使用较少堆栈和较大堆的代码在相同的内存量下工作。但是现在,通常有足够的内存(空间),可以将堆定义为与堆栈完全分离的位置。相反,堆栈溢出是通过在堆栈顶部有一个不可用的“保留”内存区域来检测的,因此操作系统会因使用不可用的内存而受到“陷阱”,应用程序可能会被终止

堆栈溢出是指用尽所有可用堆栈空间的情况。在大多数情况下,堆栈的可用空间只是系统设计者选择的任意限制。改变这一点是可能的,但在现代系统上,这并不是一个真正的问题——需要几兆字节堆栈的代码,除非系统非常庞大,否则可能没有正确设计

堆栈从“custom”开始向零增长-它必须沿着定义的方向前进,否则很难跟踪正在发生的事情,较低的addAddress和较高的address一样好。过去的情况是堆栈和堆相互靠近,这将允许使用大量堆栈而不是堆的代码与使用较少堆栈和较大堆的代码在相同的内存量下工作。但是现在,通常有足够的内存(空间),可以将堆定义为完全独立的位置