c#为什么“不安全”超出了应用程序地址之间的范围

时间:2018-07-03 11:48:28

标签: c# unsafe

通过不安全的方式研究指针时,我发现了一些奇怪的东西。

unsafe class Program
{


    static unsafe void Main(string[] args)
    {
        int A = 111;
        int B = 222;
        int* C = &A;

        Console.WriteLine("{0} A", (int)&A);
        Console.WriteLine("{0} B", (int)&B);
        Console.WriteLine("{0} *C", (int)*C);
        Console.WriteLine("{0} &C", (int)&C);
        Console.WriteLine("{0} C", (int)C);


        Process proc = Process.GetCurrentProcess();
        IntPtr startOffset = proc.MainModule.BaseAddress;
        IntPtr endOffset = IntPtr.Add(startOffset, proc.MainModule.ModuleMemorySize);

        Console.WriteLine("{0} ~ {1} original", startOffset, endOffset);
        Console.WriteLine("{0}",  (int)endOffset-(int)startOffset);

        long memory = GC.GetTotalMemory(true);
        Console.WriteLine("{0} memory", memory);

    }

}
  

结果
  11530536 A
  11530532 B
  111 * C
  11530528&C
  11530536 C
  7143424〜7176192原始
  32768
  33448内存

第一,为什么它不在应用程序的开始和结束地址之外?
我知道它分为堆和栈,但是我添加了一个类,但是结果是相同的。超出范围。

2,为什么要使用这么多的内存?
当我添加一个int时,我发现添加的内存量为24。 因为所有类型都继承对象?

请告诉我以上代码是否有问题。

2 个答案:

答案 0 :(得分:4)

  

第一,为什么它不在应用程序的起始地址和结束地址之外?

您只显示它超出了 Main 模块的范围。一个进程可以有更多模块。
而且我不认为堆栈位于任何模块的“内存范围”内。

  

2,为什么要使用那么多内存?

为什么不呢?都是虚拟的。

答案 1 :(得分:1)

模块的大小为32K。那主要包括标题和代码。

您在此处声明的非静态变量是从堆栈中分配的,该堆栈是在进程启动时动态设置的。