11

次のコードがあり、最終的にセグメンテーション違反になります。

import ctypes
from random import randint

class STRUCT_2(ctypes.Structure):
    #_pack_=2
    _fields_ = [('field_1', ctypes.c_short),
                ('field_2', ctypes.c_short),
                ('field_3', ctypes.c_short)]

class STRUCT_1(ctypes.Structure):
    #_pack_=2
    _fields_ = [('elements', ctypes.c_short),
                ('STRUCT_ARRAY', ctypes.POINTER(STRUCT_2))]

    def __init__(self,num_of_structs):
        elems = (ctypes.POINTER(STRUCT_2) * num_of_structs)()
        self.STRUCT_ARRAY = ctypes.cast(elems,ctypes.POINTER(STRUCT_2))
        self.elements = num_of_structs

        for num in range(0,num_of_structs):
            self.STRUCT_ARRAY[num].field_1 = 1
            self.STRUCT_ARRAY[num].field_2 = 2
            self.STRUCT_ARRAY[num].field_3 = 3

for num in range(0,100):
    test = STRUCT_1(num)
    print "%i done" % num

出力: 5 完了 セグメンテーション違反

しかし、field_3 が struct_2 に存在しない場合、正しく動作しているように見えます。短いフィールド (field_4) を 1 つ追加すると、セグメンテーション違反が発生します...

それで、私が間違ってやっていること、またはここで見逃したことは??

配列サイズを定義する別の方法はありますか?

4

1 に答える 1