2012-03-13 15 views
8

versión corta: ¿Cómo puedo obtener la dirección de que un ctypes puntero apunta a?obtener la dirección de memoria a la que apunta un puntero ctypes

Versión larga: que han registrado una función de Python como llamada de retorno con una biblioteca C. La biblioteca C espera la firma de la función de void (*p_func)(char stat, char * buf, short buf_len), así que registro una función apropiada de python. Cuando entre en la función python, quiero saber la dirección de memoria apuntada por buf. ¿Cómo puedo hacer esto?

+1

Ayudaría si publicaras algún código fuente usando las {} etiquetas. Gracias. – octopusgrabbus

+1

Lo he arreglado yo mismo con 'ctypes.addressof (buf.contents)' pero aún no puedo responder mi propia pregunta. –

+0

Creo que está buscando la "id" de la función http://docs.python.org/library/functions.html#id En [1]: a = 4 En [2]: id (a) Fuera [ 2]: 10019764 –

Respuesta

9

he fijado esto mismo mediante la lectura de la documentación.

lo que quería saber la ubicación de memoria de un bloque de memoria asignada por una biblioteca. Tenía el puntero ctypes que apuntaba a dicho bloque. Para obtener la dirección de memoria del bloque usé ctypes.addressof(p_block.contents).

La confusión surgió a mi entender que p_block.contents != p_block.contents, pero luego me di cuenta de que todos los objetos p_block.contents tienen el mismo buffer subyacente. La dirección del buffer subyacente se obtiene con ctypes.addressof.

+1

Eso es un poco como '& (* p)' en C donde 'p' es un puntero. Lo extraño es que ctypes no define un atributo de 'valor' para el tipo de puntero arbitrario devuelto por la función 'ctypes.POINTER'. La clase 'ctypes.c_void_p' * does * tiene el atributo' value', pero la clase devuelta por 'ctypes.POINTER' no. Muy extraño, contra intuitivo y casi huele a implementación incompleta. – amn

+1

FYI https://bugs.python.org/issue26565, "Agregar atributo de valor a punteros no básicos": >> Sé que se puede hacer una dirección de (p.contents), pero es un poco inconsistente que c_void_p y c_char_p contengan la misma información en el atributo de valor. > El 'valor' de un puntero c_char_p o c_wchar_p es un objeto Python o str. Dado que 'value' no será consistentemente el valor de la dirección, puede ser mejor introducir un atributo' as_void' de solo lectura que pueda implementarse de manera consistente para todos los tipos de punteros (incluidos los punteros de funciones). – memeplex

Cuestiones relacionadas