为啥我可以从计算机堆栈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#的末尾访问数据的主要内容,如果未能解决你的问题,请参考以下文章
IndexOutOfRangeException - 无法使用 PInvoke 查看调用堆栈