C# 编程语言中的堆栈和堆

C# 编程语言中的堆栈和堆,c#,c,heap-memory,stack-memory,C#,C,Heap Memory,Stack Memory,在C99中,以下代码行在堆栈上创建一个变量ptr,该变量指向堆上的内存区域 int *ptr = (int*)malloc(sizeof(int)*10); 堆栈和堆的定义在哪里?我在C99语言规范中找不到它们 堆栈和堆是由操作系统或指令集体系结构或其他东西定义的吗 另一个相关的问题是C#中的堆栈和堆的概念是否与C99中的概念完全相同?由于C#代码是在.Net framework上运行的,我不确定这个概念是否与C99相同。堆是分配给机器上运行的给定进程的内存量。堆栈通常是分配给当前在给定进程上

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

int *ptr = (int*)malloc(sizeof(int)*10);
堆栈和堆的定义在哪里?我在C99语言规范中找不到它们

堆栈和堆是由操作系统或指令集体系结构或其他东西定义的吗


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

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

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

然后,当您malloc一个变量时,它被存储到堆中,因此甚至可以跨多个作用域保存

请注意,当您使用完堆上存储的东西时,它们必须是空闲的,而操作系统会自动处理堆栈上的东西


签出

堆栈和堆是实现细节;正如您所发现的,C语言定义根本没有提到它们

C语言定义讨论对象的存储持续时间。具有
auto
存储持续时间的对象的生存期延伸到其封闭块上;碰巧硬件堆栈使这种行为易于实现,所以几乎所有的C实现都是这样做的。已分配
存储持续时间的对象的生存期从
malloc
/
calloc
/
realloc
调用一直延长到调用
free
。同样,几乎所有的C实现都利用系统堆来实现这种行为


但是,实现不必使用系统提供的堆栈或堆来满足对象存储持续时间要求;这将是一个多一点的工作。

这将对您有所帮助。有一个很好的答案。谢谢你的信息。然而,主要的问题是定义在哪里?在C语言中,“stack”和“heap”是通俗的说法。在语言中没有关于stack和heap的定义。这些概念与语言如何分配内存有关。将从mallloc返回的地址与一些局部变量的地址进行比较
inti=0;int*pi=&i。您会发现局部变量位于与malloc'd内存(堆)不同的内存区域(堆栈)。系统提供的堆栈或堆是什么?从硬件的角度来看,它们是一样的,对吗?那么它们是由操作系统定义的吗?@mingpepe-堆栈通常是由硬件平台定义的(我所熟悉的大多数CPU都有几个寄存器用于堆栈管理)。堆在硬件和操作系统之间混合。实现不同。什么意思是堆在硬件和操作系统之间混合?@mingpepe:意思是操作系统提供的实用程序负责管理堆中的项目,但硬件可能提供专用存储。