函数变量存储在堆或堆栈中的地址空间中?
我在考试中遇到以下问题:
当一个程序调用一个函数时,哪种类型的数据结构是为该函数中的变量分配的内存?
根据测试,HEAP是正确答案,尽管我选择了STACK。
有没有人可以为你解释原因?
提前致谢。
那么,局部变量和参数不会堆积在堆栈上。 对于本地值类型,这意味着该值本身存储在堆栈中。 对于本地引用类型,只有引用会在堆栈上。
然而,为了得到更深入的解释,我建议阅读Erik Lippert的一篇很好的博客文章(他已经在评论中指出了这篇博文):堆栈是一个实现细节,第一部分。
这是一个写得很差的问题,我想知道写这个问题的人的能力。 bejger回答说,在大多数语言中,局部变量(和函数参数)都存储在“堆栈”中。 在像C#或Java这样的参考语言中,对象通过引用存储在“堆栈”中的对象(指针)而存储在“堆”中。 这个问题是可疑的,因为它没有指定语言或确切的场景。 另外,我根本不会调用堆和堆栈“数据结构”。 它们是内存分配方案,而不是数据结构。
首先,C#没有“功能”; 它有“方法”。
“在哪种类型的数据结构是为该函数中的变量分配的内存?”是什么意思?
Nota Bene:为了记录,“LIFO”是一种访问策略(Last-In,First-Out),而不是数据结构。 通常,将一个STACK称为LIFO STACK。 但我离题了。
正确答案通常是,也是
本地变量的插槽(只存在于方法调用上下文中的变量)在方法调用期间在堆栈帧内分配,该方法调用位于程序堆栈中。
如果变量是引用类型,那么该引用是对实际对象实例的引用,当实例化/实例化时,该内存将从堆中分配。
如果变量是一个值类型,该槽[通常,但不总是]对象实例本身。 。 。 但这不是一个给定的。 值类型可以(并且),如果需要的话,可以在堆上分配。 在这种情况下,变量的堆栈帧插槽与值类型一样,是对堆中分配的实例的引用。
链接地址: http://www.djcxy.com/p/79141.html上一篇: Function variables stored on heap or stack in address space?
下一篇: How do Haskell compilers decide whether to allocate on the heap or the stack?