c# - 想知道为什么指针算法在 asp.net 中不起作用

标签 c# math pointers

我想在 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/

相关文章:

通过基类变量访问的 C# 保护成员

c# - 域对象更改 - 需要刷新缓存列表

c# - 如何使用 C# 舍入到最接近的 .5

algorithm - 有什么有效的方法可以找到这样的颜色吗?

c - 使用指向结构的指针数组期间出现段错误

c++ - 从函数返回 char* 无效

c# - 在 WCF 中实现丰富的域模型,其中客户端对象充当远程外观

c# - 在 asp.net 中使用 session 变量作为参数

math - 如何正确调整玩家 Sprite 速度? (基本上是一道数学题?)

c - 带有 char 指针的字符串