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



在通过不安全研究指针时,我注意到了一些奇怪的东西。

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 内存

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

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

如果上面的代码有问题,请告诉我。

1st,为什么它在应用程序的开始和结束地址之外?

您仅显示它超出了模块的范围。一个进程可以有多个模块。
而且我不认为堆栈在任何模块的"内存范围"内。

2nd,为什么使用这么多内存?

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

模块的大小为 32K。这主要由标头和代码组成。

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

相关内容

最新更新