2011-07-14 10 views
6

Tengo problemas para entender la diferencia entre los punteros LP_ * (por ejemplo, LP_c_char) y * _p (por ejemplo, c_char_p) en los tipos de Python. ¿Hay documentación que los distinga?¿Cuál es la diferencia entre los punteros LP_ * y punteros * _p en ctypes? (y una interacción extraña con las estructuras)

Lo poco que he leído sobre * _p punteros sugiere que son mejores (de alguna manera no especificada), pero cuando intento usarlos como campos de estructura, obtengo un comportamiento extraño. Por ejemplo, puedo crear una estructura con un campo de puntero LP_c_char:

import ctypes 
char = ctypes.c_char('a') 
class LP_Struct(ctypes.Structure): 
    _fields_ = [('ptr', ctypes.POINTER(ctypes.c_char))] 

struct = LP_Struct(ctypes.pointer(char)) 
print type(struct.ptr) 

y el puntero resultante es:

<class 'ctypes.LP_c_char'> 

Pero cuando se crea una estructura con un campo de puntero c_char_p:

class Struct_p(ctypes.Structure): 

    _fields_ = [('ptr', ctypes.c_char_p)] 

p = ctypes.pointer(char) 
struct = Struct_p(ctypes.cast(p, ctypes.c_char_p)) 
print type(struct.ptr) 

el campo "ptr" resultante es

<type 'str'> 

En otras palabras, el puntero ha sido desreferenciado en algún lugar del proceso.

Respuesta

9

http://docs.python.org/library/ctypes.html#ctypes.c_char_p

Representa el tipo de datos char * C cuando apunta a una cadena terminada en cero. Para un puntero de carácter general que también puede apuntar a datos binarios, se debe usar POINTER (c_char).

c_char_p se correlaciona con el tipo de Python str porque está asumiendo que usted se refiere a una cadena, que es generalmente el caso cuando se está utilizando char * en C. LP_c_char no considera esa suposición.

tipos de datos fundamentales, cuando devuelve como resultados llamada a la función externa, o, por ejemplo, mediante la recuperación de los miembros campo de estructura o elementos de matriz, se convierten de forma transparente a los tipos de Python nativas. En otras palabras, si una función extranjera tiene un restype de c_char_p, siempre recibirá una cadena de Python, no una instancia de c_char_p.

Cuestiones relacionadas