Python Ctypes преобразует указатель void в значение nonetype и long. Каковы последствия? Что это значит?

Я создаю структуру ctype. У меня есть внешняя функция, которая требует передачи указателя на эту структуру. Предполагается, что структура ctype содержит указатель void.

Пример прототипа функции:

ExtFunc(
TestStruct* myVoidStruct
);

где моя C-эквивалентная структура определяется следующим образом:

typedef struct voidStruct
{
    void* voidField;
} voidStruct;

Я пытаюсь создать такую ​​структуру, но неизменно указатель void интерпретируется Python как нечто иное, чем указатель void.

Каковы последствия этого, если таковые имеются? Означает ли это, что внешняя функция также интерпретирует этот элемент структуры как нечто иное, чем пустой указатель?

>>> class TestStruct(ctypes.Structure):
    _fields_ = [("voidField", ctypes.c_void_p)]

>>> x = TestStruct()

И сразу же voidField возвращается как NoneType

>>> type(x.voidField)
<type 'NoneType'>

Но я могу создать и поддерживать указатель void вне структуры:

>>> y = ctypes.c_void_p(123)
>>> y
c_void_p(123L)

Как я уже сказал выше, я передаю свою структуру внешней функции. Когда функция завершается, элементы структуры имеют тип «длинный» с соответствующим значением

>>> x.voidField
88145984L
>>> type(x.voidField)
<type 'long'>

Почему теперь тип длинный? И каково значение его стоимости? Это адрес памяти указателя? Адрес памяти, куда указывает указатель? Или это значение первых нескольких байтов по адресу памяти, на который он указывает?


person Joe    schedule 28.06.2013    source источник


Ответы (2)


И сразу же voidField возвращается как NoneType

Это просто потому, что указатель NULL переводится на Python None...

>>> from ctypes import *
>>> class TestStruct(Structure):
...  _fields_ = [("voidField", c_void_p)]
...
>>> x.voidField = 0
>>> print repr(x.voidField)
None

Почему теперь тип длинный?

Как только вы установите указатель на что-то отличное от нуля, это будет либо Python int, либо Python long...

>>> x.voidField = 123
>>> print repr(x.voidField)
123

И каково значение его стоимости?

Это адрес, на который указывает указатель void *, т. е. то, что вы получите от чего-то вроде...

void* ptr = malloc(1000);
printf("%ld\n", (long) ptr);
person Aya    schedule 28.06.2013

Указатели C — это целые числа, где значением является адрес памяти объекта, на который указывает указатель. Тип указателя - это просто подсказка, чтобы узнать, сколько байтов нужно захватить при разыменовании.

person MJ Howard    schedule 28.06.2013