c # почему «небезопасно» вне диапазона между адресом приложения - PullRequest
0 голосов
/ 03 июля 2018

При изучении указателя через небезопасно я заметил что-то странное.

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 * С
11530528 & C
11530536 C
7143424 ~ 7176192 оригинал
32768
33448 памяти

1-й, почему он находится за пределами начального и конечного адресов приложений?
Я знаю, что он разделен на кучу и стек, но я добавил класс, но результаты совпадают. Это вне диапазона.

2-й, Почему так много памяти используется?
Когда я добавил один int, я обнаружил, что объем добавленной памяти составляет 24. Потому что все типы наследуют объекты?

Пожалуйста, дайте мне знать, если есть проблема с вышеуказанным кодом.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

1-й, почему он находится за пределами начального и конечного адресов приложений?

Вы только показываете, что он находится вне диапазона для Main Module. Процесс может иметь больше модулей.
И я не думаю, что стек находится внутри «диапазона памяти» любого модуля.

2-й, Почему так много памяти используется?

Почему бы и нет? Это все виртуально.

0 голосов
/ 03 июля 2018

Размер модуля 32К. Это в основном состоит из заголовков и кода.

Нестатические переменные, которые вы объявляете здесь, выделяются из стека, который устанавливается динамически при запуске процесса.

...