通过不安全的方式研究指针时,我发现了一些奇怪的东西。
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。
因为所有类型都继承对象?
请告诉我以上代码是否有问题。
答案 0 :(得分:4)
第一,为什么它不在应用程序的起始地址和结束地址之外?
您只显示它超出了 Main 模块的范围。一个进程可以有更多模块。
而且我不认为堆栈位于任何模块的“内存范围”内。
2,为什么要使用那么多内存?
为什么不呢?都是虚拟的。
答案 1 :(得分:1)
模块的大小为32K。那主要包括标题和代码。
您在此处声明的非静态变量是从堆栈中分配的,该堆栈是在进程启动时动态设置的。