每个内存位置,堆栈,堆等的目的是什么? (在技术方面失败)

时间:2010-10-13 06:10:40

标签: memory

好的,我昨天询问了Stackoverflow和bufferoverflow之间的区别,几乎被投票遗忘,没有新信息。

所以它让我思考,我决定重新解释我的问题,希望得到答复,这实际上解决了我的问题。

所以这里什么都没有。

我知道有四个内存段(如果我错了,请纠正我)。代码,数据,堆栈和堆。现在AFAIK代码段存储代码,而数据段存储与程序相关的数据。让我严重困惑的是堆栈和堆的目的!

根据我的理解,当你运行一个函数时,函数的所有相关数据都会存储在堆栈中,当你递归调用函数内部的函数时,函数内部...当函数在等待时在前一个函数的输出上,函数及其必要的数据不会从堆栈中弹出。所以最终会出现堆栈溢出。 (如果我错了,请再次纠正我)

我也知道堆的用途。正如我在某处所读到的,它用于在程序执行时动态分配数据。但这提出了更多解决我问题的问题。我最初在代码中初始化变量时会发生什么..它们是在代码段中还是在数据段中还是在堆中?数组存储在哪里?是在我的代码执行后,我的堆中的所有内容都被删除了吗?总而言之,请以更简单的方式告诉我有关堆的问题,请参阅malloc和alloc,因为我不确定我完全理解这些术语是什么!

我希望人们在回答问题时不要迷失于技术性问题,并且能够让外行人理解这些术语(即使要描述的概念不是非常规的),并且在我们的技术术语中继续教育我们走。我也希望这不是一个太大的问题,因为我认真地认为不能单独提问!

3 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

关于堆栈......这是存储函数/过程的参数和局部变量的准确位置。更确切地说,当前正在执行的函数的参数和局部变量只能从堆栈中访问...属于在它之前执行的函数链的其他变量将在堆栈中但在当前函数之前不可访问完成了它的运作。

关于全局变量,我相信它们存储在数据段中,并且始终可以从创建的程序中的任何函数访问。

关于Heap ......这些是可以在需要时分配给程序的额外内存(malloc或new)...你需要知道堆中分配的内存在哪里(地址/指针)这样您就可以在需要时访问它。如果您丢失了地址,内存将无法访问,但数据仍然存在。 根据平台和语言,这必须由您的程序手动释放(或发生内存泄漏)或需要进行垃圾收集。堆叠比较大,因此可用于存储大量数据(如文件,流等)...这就是为什么在堆中创建对象/文件以及指向对象/文件的指针存储在堆栈中。

答案 2 :(得分:0)

就C / C ++程序而言,数据段存储静态(全局)变量,堆栈存储局部变量,堆存储动态分配的变量(任何mallocnew来获取一个指针)。代码段仅存储机器代码(程序中由CPU执行的部分)。