2011-07-14 7 views
6

LP_ *(例:LP_c_char)と* _p(例:c_char_p)の違いをPythonのctypesで理解できない場合があります。それらを区別する文書はありますか?ctypesのLP_ *ポインタと* _pポインタの違いは何ですか?

私が* _pポインタについて読んだことは、(いくつかの不特定の方法で)より優れていることを示唆していますが、構造フィールドとして使用しようとすると、私は奇妙な動作をします。例えば、私は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) 

を、そして得られたポインタは次のとおりです。

<class 'ctypes.LP_c_char'> 

しかし、私は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) 

得られた "PTR" フィールドは

<type 'str'> 
です

つまり、ポインタはプロセスのどこかで参照解除されています。

答えて

9

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

それがゼロで終わる文字列を指す場合Cチャー*データ型を表します。バイナリデータを指す一般的な文字ポインタの場合は、POINTER(c_char)を使用する必要があります。

c_char_pあなたがC. LP_c_charchar *を使用しているとき、一般的にそうである文字列を参照していると仮定しているため、Pythonのstrタイプにマッピングされているが、そのような仮定を行うものではありません。構造フィールドメンバーまたは配列のアイテムを検索することによって、例えば、外部関数呼び出しの結果として返され、又は

基本データ・タイプは、透過ネイティブPythonの型に変換されます。言い換えれば、外部関数がc_char_pのrestypeを持っている場合は、常にc_char_pインスタンスではなくPython文字列を受け取ります。

関連する問題