2012-03-13 16 views
8

Skrócona wersja: Jak mogę uzyskać adres, na który wskazuje wskaźnik ctypes?Uzyskaj adres pamięci wskazywany przez wskaźnik ctypes

Długa wersja: Zarejestrowałem funkcję Pythona jako wywołanie zwrotne z biblioteką C. Biblioteka C oczekuje sygnatury funkcji void (*p_func)(char stat, char * buf, short buf_len), więc rejestruję odpowiednią funkcję pythona. Kiedy wchodzę w funkcję Pythona, chcę znać adres pamięci wskazany przez buf. Jak mogę to zrobić?

+1

Pomoże Ci, jeśli zamieścisz kod źródłowy za pomocą znaczników {}. Dzięki. – octopusgrabbus

+1

Naprawiłem to za pomocą 'ctypes.addressof (buf.contents)' ale nie mogę jeszcze odpowiedzieć na moje pytanie. –

+0

Myślę, że szukasz "id" funkcji http://docs.python.org/library/functions.html#id In [1]: a = 4 In [2]: id (a) Out [ 2]: 10019764 –

Odpowiedz

9

Naprawiłem to sam, czytając dokumentację.

Chciałam poznać lokalizację pamięci bloku pamięci przydzielonego przez bibliotekę. Miałem wskaźnik ctypes, który wskazywał na wspomniany blok. Aby uzyskać adres pamięci bloku użyłem ctypes.addressof(p_block.contents).

Zamieszanie powstało wokół mojego zrozumienia, że ​​p_block.contents != p_block.contents, ale potem zdałem sobie sprawę, że wszystkie obiekty mają ten sam bazowy bufor. Adres bazowego bufora jest uzyskiwany z ctypes.addressof.

+1

To trochę jak '& (* p)' w C gdzie 'p' jest wskaźnikiem. Dziwne jest to, że ctypes nie definiuje atrybutu "value" dla dowolnego typu wskaźnika zwracanego przez funkcję 'ctypes.POINTER'. Klasa 'ctypes.c_void_p' ma * atrybut" value ", ale klasa zwrócona przez' ctypes.POINTER' nie ma. Bardzo dziwne, sprzeczne z intuicją i niemal cuchnące niezupełną implementacją. – amn

+1

FYI https://bugs.python.org/issue26565, "Dodaj atrybut wartości do nie podstawowych wskaźników": >> Wiem, że można zrobić adresof (p.contents), ale jest nieco niespójne, że c_void_p i c_char_p zawierają te same informacje w atrybucie wartości. > "Wartość" wskaźnika c_char_p lub c_wchar_p jest obiektem typu Python bytes lub str. Ponieważ 'wartość' nie będzie konsekwentnie wartością adresową, może być lepiej wprowadzić atrybut tylko do odczytu' as_void', który może być zaimplementowany konsekwentnie dla wszystkich typów wskaźników (w tym wskaźników funkcji). – memeplex

Powiązane problemy