2015-11-26 57 views
7

在C99,下面的代码行创建堆栈的变量的ptr指向在堆上的存储器区域。栈和堆在编程语言

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

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

堆栈和堆栈是由操作系统还是指令集架构定义的?

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

+0

这将部分地帮助你。有一个很好的答案。 http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – niksofteng

+0

感谢您的信息。但主要问题是定义在哪里? – mingpepe

+0

在C中,“堆栈”和“堆”是口语化的。 – immibis

回答

1

堆是被分配给在所述计算机上运行的给定过程的存储器的量。堆栈通常分配给当前在给定进程上运行的线程的内存量较小。

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

然后,当你malloc一个变量它被存储到堆,因此保存,甚至跨多个范围。

请注意,堆中存储的内容必须在完成使用时释放,而操作系统会自动处理该内容。

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

6

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

C语言定义讲述了存储持续时间的对象。具有auto存储时间的对象的生命周期延伸到它们的封闭块;硬件堆栈使得该行为易于实现,所以几乎所有C实现都这样做。具有allocated存储持续时间的对象具有从malloc/calloc/realloc呼叫延伸到致电free的延续时间。同样,几乎所有的C实现都利用系统堆来实现这种行为。

但是,实施并不具有具有以使用系统提供的堆栈或堆以满足对象存储持续时间要求;这只是一个更多的工作。

+0

什么是系统提供的堆栈或堆?从硬件角度来看,它们是一回事吗?那么它们是由操作系统定义的吗? – mingpepe

+0

@mingpepe - 堆栈通常由硬件平台定义(我熟悉的大多数CPU都会使用几个寄存器堆栈管理)。堆硬件和操作系统之间混合使用。实现不同。 –

+0

堆硬件和操作系统之间的混合是什么意思? – mingpepe