【问题标题】:Stack and heap in programming language编程语言中的栈和堆
【发布时间】:2016-02-29 02:32:46
【问题描述】:

在 C99 中,以下代码行在堆栈上创建一个变量 ptr,该变量指向堆上的内存区域。

int *ptr = (int*)malloc(sizeof(int)*10);

栈和堆的定义在哪里?我在 C99 语言规范中找不到它们。

堆栈和堆是由操作系统或指令集架构还是其他东西定义的?

另外一个相关的问题是,C#中栈和堆的概念是否与C99中的概念完全一致?由于 C# 代码是在 .Net 框架上运行的,我不确定这个概念是否与 C99 相同。

【问题讨论】:

  • 这将对您有所帮助。有一个很好的答案。 stackoverflow.com/questions/79923/…
  • 感谢您的信息。然而,主要问题是定义在哪里?
  • 在 C 中,“stack”和“heap”是俗语。
  • 语言中没有堆栈和堆的定义。这些是与语言如何分配内存有关的概念。比较你从 mallloc 返回的地址和一些局部变量int i=0; int * pi = &i; 的地址。您会发现局部变量与 malloc 的内存(堆)位于不同的内存区域(堆栈)中。

标签: c# c heap-memory stack-memory


【解决方案1】:

栈和堆是实现细节;就像您发现的那样,C 语言定义根本没有提到它们。

C 语言定义讨论了对象的存储持续时间。具有auto 存储持续时间的对象的生命周期会延伸到其封闭块;碰巧硬件堆栈使该行为易于实现,因此几乎所有 C 实现都这样做。具有allocated 存储持续时间的对象的生命周期从malloc/calloc/realloc 调用延伸到对free 的调用。同样,几乎所有 C 实现都利用系统堆来实现该行为。

然而,实现并不必须使用系统提供的堆栈或堆来满足对象存储持续时间的要求;只是需要做更多的工作。

【讨论】:

  • 什么是系统提供的栈或堆?从硬件的角度来看,它们是一回事吗?那么它们是由操作系统定义的吗?
  • @mingpepe - 堆栈通常由硬件平台定义(我熟悉的大多数 CPU 都将几个寄存器用于堆栈管理)。堆在硬件和操作系统之间混合。实现方式不同。
  • 堆在硬件和操作系统之间混合是什么意思?
  • @mingpepe:表示操作系统提供的实用程序负责管理堆中的项目,但硬件可能提供专门的存储。
【解决方案2】:

堆是分配给机器上运行的给定进程的内存量。堆栈通常是分配给当前在给定进程上运行的线程的较小内存量。

当您创建一个局部变量时,它会存储到堆栈中。这种内存选择称为堆栈,因为它处理作用域时,会从可寻址空间推送或弹出不同的值,就像处理堆栈数据结构一样。

然后,当您 malloc 一个变量时,它会存储到堆中,因此即使跨多个范围也可以保存。

请注意,存储在堆上的东西在使用完后必须释放,而操作系统会自动处理堆栈上的东西。

结帐http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2011-05-06
    • 2015-12-30
    • 2012-04-05
    • 2013-11-05
    • 2012-01-19
    • 2023-01-03
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多