我想在 C# 中尝试指针运算。我使用了一个 asp.net 网络应用程序,希望它是这个应用程序还是一个控制台应用程序并不重要。
这是我尝试过的:
public class memorytest
{
public class Sample
{
public int A;
public int B;
public int C;
public int D;
}
public static unsafe void Main()
{
Sample s = new Sample {A = 1, B = 2, C = 3, D = 4};
int a = 1;
int b = 2;
int* pA = &a;
int* pB = &b;
Debug.WriteLine("{0:x16}",* pB);
Debug.WriteLine("{0:x16}",*(pB - 1));
Debug.WriteLine(*pA);
Debug.WriteLine("{0:x16}",*(pB - 2));
}
}
结果是这样的:
0000000000000002, 0000000004b5ca00, 1、 0000000004b5c9fc,
我显然期待第二个是数字 1。有人明白这一点吗?
最佳答案
首先,如果您想了解堆栈的布局方式,似乎启动调试器并在调试器中查看堆栈会容易得多。
假设出于某种原因你想继续编写程序来检查它们自己的堆栈状态:你停止试验太早了。你应该写的程序是:
Debug.WriteLine("{0:x16}",*(pB - 1));
Debug.WriteLine("{0:x16}",*(pB + 0));
Debug.WriteLine("{0:x16}",*(pB + 1));
然后你会得到输出
00000badf00dd00d <-- some pointer value
0000000000000002 <-- contents of b
0000000000000001 <-- contents of a
并且您会了解到堆栈的增长方向与您认为的相反。在许多架构中,将某些内容插入堆栈减少堆栈指针。
当然,正如其他人所指出的,我们不保证任何东西在堆栈上的布局,或者即使东西首先进入堆栈;局部变量在某些情况下可能会放在堆上,并且可能会注册从未使用过地址的局部变量。例如,如果不取“a”的地址会怎样?它仍然在堆栈上吗?也许不会!
关于c# - 想知道为什么指针算法在 asp.net 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615497/