C#更改局部变量的值 - 堆栈表示

时间:2016-10-05 10:29:21

标签: c# memory stack

我对C#中的堆栈变量有疑问,请看下面的示例:

static void Main(string[] args)
{
     int a = 1; //this element goes to the stack as the first one 
     int b = 2; //second element in the stack
     a = 4;
     a++;
}

如何在不从堆栈弹出变量“b”的情况下更改变量“a”的值?

如果有人解释我在这种情况下是如何运作的,我将不胜感激?

2 个答案:

答案 0 :(得分:1)

.NET用来保存值类型的内存构造确实称为“堆栈”,但它并不意味着每个变量都保存在LIFO结构中,您可以在其中只访问最后一个。

因此,要回答您的问题 - 当您需要访问变量a时 - CLR会完全执行此操作(即直接访问它),此处无需弹出任何内容。

您可以阅读更多相关信息,例如:http://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/

答案 1 :(得分:0)

本地变量确实位于堆栈上,但编译器会隐藏堆栈。基本上,它将变量转换为相对于堆栈顶部的地址。在您的示例中,编译器知道b是堆栈中的最后一个东西,而且是最后一个。

执行某个功能时,一个寄存器(经典8086处理器上的SP,现在可能是ESP或其他东西)指向堆栈顶部的地址。函数参数和局部变量的地址为[SP + n],其中n是堆栈顶部的字节数。