编程语言中的堆栈与堆

7
在C99中,以下这行代码会在栈上创建一个名为ptr的变量,并将其指向堆上的一个内存区域。
int *ptr = (int*)malloc(sizeof(int)*10);

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

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

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


这会在一定程度上帮助你。有一个很好的答案。https://dev59.com/hHVD5IYBdhLWcg3wHn2d - Nikhil Vartak
谢谢您提供的信息。然而,主要问题是定义在哪里? - mingpepe
在C语言中,“stack”和“heap”是口语化的术语。 - user253751
2
该语言中没有关于堆栈和堆的定义。这些是与语言如何分配内存有关的概念。将从malloc返回的地址与一些本地变量int i = 0; int * pi =&i;的地址进行比较。您会发现本地变量位于内存的不同区域(堆栈)中,而malloc'd内存位于堆中。 - Galax
2个回答

6
堆栈和堆是实现细节;正如您发现的那样,C语言定义根本没有提到它们。
C语言定义谈论对象的存储期。具有自动存储期的对象的生命周期延伸到其封闭块上;碰巧硬件堆栈使得这种行为易于实现,因此几乎所有的C实现都这样做。具有分配存储期的对象的生命周期从malloc/calloc/realloc调用开始,直到调用free。同样,几乎所有的C实现都利用系统堆来实现这种行为。
然而,实现不必使用系统提供的堆栈或堆来满足对象存储期要求;这只需要更多的工作。

系统提供的堆栈或堆是什么?从硬件的角度来看,它们是同一件事,对吗?那么它们是由操作系统定义的吗? - mingpepe
1
@mingpepe - 栈通常由硬件平台定义(我熟悉的大多数CPU都会分配一些寄存器用于栈管理)。堆则是硬件和操作系统共同管理的。实现方式各不相同。 - John Bode
堆是硬件和操作系统之间混合的意思是什么? - mingpepe
1
@mingpepe:这意味着操作系统提供的实用程序负责管理堆中的项目,但硬件可能提供专门的存储。 - John Bode

1
堆是分配给运行在机器上的给定进程的内存量。栈是分配给当前正在运行的线程的一般较小的内存量。
当您创建局部变量时,它存储到堆栈中。这个可寻址空间处理不同的值作用域,因此会像使用堆栈数据结构一样推入或弹出不同的值。
然后,当您malloc一个变量时,它会被存储到堆中,因此即使跨多个作用域也会保存。
请注意,存储在堆中的内容在使用完毕后必须被释放,而操作系统会自动处理堆栈中的内容。
查看http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接