Помогите мне с этим кодом указателя C # - PullRequest
0 голосов
/ 16 февраля 2010

Я отправляю код.

using System;
using System.Runtime.InteropServices;
class TestPointer
{
    public static void Main(string[] args)
    {        
        if (args.Length == 0)
        {
            unsafe
            {
                int t = 8;
                int* p = &t;
                IntPtr addr = (IntPtr)p;

                Console.WriteLine(addr.ToString("x"));
                Console.WriteLine("before: " +(*p));
                Console.ReadLine();
                Console.WriteLine("after: " + (*p));
            }
        }
        else
        {
            unsafe
            {
                string str = args[0];
                GCHandle handle = GCHandle.Alloc(str, GCHandleType.Pinned);
                IntPtr pointer = GCHandle.ToIntPtr(handle);

                int* p = (int*)pointer;
                int t = 5;
                p = &t;

                Console.WriteLine((*p));
            }
        }
    }
}

Я запускал этот код в двух случаях.

в instance1 Я вызвал TestPointer.exe, instance1 показывает расположение в памяти 8, а затем выполнение остановлено в операторе Console.ReadLine (). На следующем шаге я запускаю другой экземпляр (instance2) с TestPointer.exe 12f470 (адрес памяти показан из instance1), поэтому в этом случае я меняю значение с 8 на 5 и после ReadLine из instance1 должно показывать значение 5, но оно все еще отображает 8. в чем причина?

Ответы [ 3 ]

1 голос
/ 16 февраля 2010

Ну, во-первых, память изолирована между экземплярами. Это было не так во времена MS-DOS, но в настоящее время это «главная директива» каждой современной ОС.

Таким образом, вы никогда не сможете обмениваться данными между экземплярами таким образом.

С другой стороны, распределитель памяти не гарантирует, что он будет распределять память в том же месте, когда он вызывается - далеко от него. Мой совет - держаться подальше от жестко закодированных адресов.

И для некоторой перспективы здесь ... Кажется, что вам нужно изучить много основ об ОС, CLR и управлении памятью. Для меня это означает, что вы не должны касаться «небезопасной» конструкции. Ты играешь с огнем. Это продвинутая конструкция, в первую очередь предназначенная для взаимодействия со старыми кодовыми базами. Мой совет - держись от этого подальше.

1 голос
/ 16 февраля 2010

Два процесса имеют два разных виртуальных адресных пространства. Я был бы совершенно в ужасе, если бы один процесс мог растоптать значения в другом процессе без явного выполнения какого-либо разделения (файлы с отображением в памяти и т. Д.).

Было ли это упражнение в образовании, или вы пытаетесь достичь чего-то, и это была только начальная попытка? Если это последнее, пожалуйста, дайте нам более подробную информацию о том, что вы пытаетесь сделать.

0 голосов
/ 16 февраля 2010

Причина в том, что вы не можете так легко получить доступ к памяти другого процесса. Это называется «Виртуальная память», и современные ОС защищают память запущенных процессов от повреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...