2

ctype 構造を作成しています。この構造体へのポインターを渡す必要がある外部関数があります。ctype 構造体には void ポインターが含まれているはずです。

関数プロトタイプの例:

ExtFunc(
TestStruct* myVoidStruct
);

ここで、C に相当する構造は次のように定義されます。

typedef struct voidStruct
{
    void* voidField;
} voidStruct;

私はそのような構造を作成しようとしましたが、常に void ポインターは Python によって void ポインター以外のものとして解釈されます。

もしあれば、これの意味は何ですか?これは、外部関数も構造体のこの要素を 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)

上で述べたように、構造体を外部関数に渡しています。関数が完了すると、構造要素は関連する値を持つ「long」型になります。

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

なぜ今は長いタイプなのですか?そして、その価値の重要性は何ですか?これはポインタのメモリアドレスですか?ポインタが指しているメモリアドレスは? それとも、それが指しているメモリアドレスの最初の数バイトの値ですか?

4

2 に答える 2