Адрес памяти C# и переменная

Я не уверен, почему joaquin отправил свой ответ в качестве комментария, но это правильный ответ:

запустить ipython с помощью ipython notebook --pylab inline

Edit: Ok, это теперь устарел в соответствии с комментарием ниже. Используйте магию% pylab.

24
задан Ray Lu 26 February 2009 в 04:17
поделиться

2 ответа

Для № 2 & оператор будет работать тем же способом в C. Если переменная не находится на стеке, Вы, возможно, должны использовать fixed оператор для придавливания его, в то время как Вы работаете так, сборщик "мусора" не перемещает его, все же.

Для № 1, ссылочные типы более хитры: необходимо будет использовать GCHandle, и ссылочный тип должен быть blittable, т.е. иметь определенное расположение памяти и быть поразрядно copyable.

для доступа к адресу как к числу, можно бросить от типа указателя до IntPtr (целый тип, определенный, чтобы быть тем же размером как указатель), и оттуда к uint или ulong (в зависимости от размера указателя базовой машины).

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class Blittable
{
    int x;
}

class Program
{
    public static unsafe void Main()
    {
        int i;
        object o = new Blittable();
        int* ptr = &i;
        IntPtr addr = (IntPtr)ptr;

        Console.WriteLine(addr.ToString("x"));

        GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
        addr = h.AddrOfPinnedObject();
        Console.WriteLine(addr.ToString("x"));

        h.Free();
    }
}
14
ответ дан Jeffrey Hantin 29 November 2019 в 00:16
поделиться

Номер 1 не возможен вообще, у Вас не может быть указателя на управляемый объект. Однако можно использовать структуру IntPtr для получения информации об адресе указателя в ссылке:

GCHandle handle = GCHandle.Alloc(str, GCHandleType.Pinned);
IntPtr pointer = GCHandle.ToIntPtr(handle);
string pointerDisplay = pointer.ToString();
handle.Free();

Для номера 2 Вы используете & оператор:

int* p = &myIntVariable;

Указатели, конечно, должны быть сделаны в небезопасном блоке, и необходимо позволить небезопасный код в настройках проекта. Если переменная является локальной переменной в методе, она выделяется на стеке, таким образом, она уже фиксируется, но если переменная является членом объекта, необходимо прикрепить тот объект в памяти с помощью fixed ключевое слово так, чтобы она не была перемещена сборщиком "мусора".

5
ответ дан Guffa 29 November 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: