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.