为啥我可以从计算机堆栈c#的末尾访问数据

Posted

技术标签:

【中文标题】为啥我可以从计算机堆栈c#的末尾访问数据【英文标题】:why i can acces data from end of computer stack c#为什么我可以从计算机堆栈c#的末尾访问数据 【发布时间】:2021-10-23 06:54:49 【问题描述】:

在 c# 中,int 是值类型并存储在堆栈中。堆栈作为 LIFO 工作,因此我无法从末尾或中间访问数据

 static void Main() 
        int a = 1;
        int b = 2;
        int c = 3;
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
      

如果a变量在栈尾,为什么我可以先打印它

【问题讨论】:

The stack is an implementation detail,您真正需要了解的是它的行为。但真正的答案在于堆栈由整个堆栈帧组成,其中包含函数调用的所有局部变量,而不是一系列单个变量。 @Charlieface 谢谢。现在好了 【参考方案1】:

为什么我可以先打印一个变量,如果它在堆栈的末尾

因为总是有一个指向栈尾的指针,而编译器知道 a 距离这个指针还有 12 个字节。

当此方法返回时,堆栈指针将递减,并且这些 int 值将超出堆栈的末尾。

【讨论】:

1) 如果我只想打印位于堆栈中间的b 变量怎么办。为什么我可以在不删除c 变量的情况下打印它? 2) 什么意思是“int 值将超出堆栈的末尾。”。这些变量将被移动到哪里? @ZeroBug 什么都没有移动,堆栈指针递减,这意味着 所有 局部变量在逻辑上不再是堆栈的一部分,可以删除或覆盖 而且您可以在任何地址读写,而不仅仅是在末尾。

以上是关于为啥我可以从计算机堆栈c#的末尾访问数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个计算代码没有正确执行?

为啥在 C# 参考文本中引用堆栈和堆?

IndexOutOfRangeException - 无法使用 PInvoke 查看调用堆栈

从 C# 访问 Oracle 数据库

为啥我的程序需要两行输入,为啥我的 GPA 计算错误 c#?

为啥这个 BigInteger 值会导致堆栈溢出异常? C#