2

配列をフィールドとしてctypes構造を定義するとc_char、そのフィールドのサイズを取得できませんが、c_ubyte配列に切り替えると取得できます。私の理解では、次の例では、Pythonはbar2ポインター(char *)として扱われますが、ではありませんbar1。誰かがその背後にある論理を説明できれば幸いです。

import ctypes
class Foo(ctypes.Structure):
    _fields_ = [ ('bar1', ctypes.c_ubyte*1),
                 ('bar2', ctypes.c_char*1) ]
foo = Foo()
for f,t in foo._fields_:
    print t

print ctypes.sizeof(foo.bar1)
print ctypes.sizeof(foo.bar2)

これが出力です:

<class '__main__.c_ubyte_Array_1'>
<class '__main__.c_char_Array_1'>
1
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    print ctypes.sizeof(foo.bar2)
TypeError: this type has no size
4

1 に答える 1

3

foo.bar1は確かに1ubyteのctypes配列ですがfoo.bar2、配列内にあるものから作成された文字列であり、nullで終了するC文字列と見なされます。長さ5など、より長い配列を作成すると、より明確になります。たとえば、文字「A」が繰り返されている場合は、次のようになりfoo.bar1ます。

<__main__.c_ubyte_Array_5 object at 0xf7551df4>

一方foo.bar2

"AAAAA"

これは通常のPython文字列です。これは、このタイプの特殊なケースですc_char"AAAAA"確かに、そもそもこの値を書き込むクリーンな方法がないので、それは迷惑bar2です...

于 2013-01-27T18:32:44.493 に答える