1

ボイド動的配列のメモリ割り当てに**

typedef struct DArray{ 
    void **array; 
    int capacity; 
    int size; 
    void (*display)(FILE *, void *); //function pointer to a non-generic display function 
} DArray; 

しかし、現在の動作で、配列のサイズを変更していないように、そしてゼロでないインデックスにアクセスしようとすると、いつでもセグメンテーションがスローされます。コンストラクタと挿入関数は次のようになります。

DArray *newDArray(void (*d)(FILE *,void *)){ 
    DArray *myDarray = malloc(sizeof(DArray)); 
    myDarray->array = malloc(sizeof(void *)); //size = 1 for now, otherwise multiply by array length 
    myDarray->capacity = 1; 
    myDarray->size = 0; 
    myDarray->display = d; 
    return myDarray; 
} 

void insertDArray(DArray *a,void *v){ 
    if (a->size < a->capacity) 
     a->array[a->size] = v; 
    else{ 
     void **newArray = malloc(sizeof(void *) * a->capacity * 2); //double size 
     for (int i = 0; i <= a->size; i++) 
      newArray[i] = a->array[i]; //clone old array 
     a->capacity = a->capacity * 2; 
     free(a->array); 
     a->array = newArray; 
    } 
    a->size++; 
} 

ここで私の指摘を理解できません。私は何が起きているのかというと、a->配列へのポインタはまだ未定義の古い配列を指していますが、*a->array = newArray;を実行するとどちらも機能しません。誰かがこれについていくつかの光を当てることができますか?

+0

単一の開始のための任意の理由( '...の線に沿って、あなたのコードのロジックを変更ボイド* ')十分ではない? – StoryTeller

+0

@StoryTellerジェネリック(void *)型を処理するには配列を実装する必要があります。私はポインタの配列を持っているべきだと信じています。 –

+1

ポインタを配列に挿入すると、 'size'メンバは必要ありません。オブジェクトを挿入するとポインタの配列は必要ありません – StoryTeller

答えて

3

このループによってバッファオーバーランが発生しました。 i < a->sizeである必要があります。これは、容量が5の場合は、サイズが5のときにのみ展開するため、配列の6番目の要素にアクセスするためです。

for (int i = 0; i <= a->size; i++) 

サイズを変更すると、新しい値も追加されません。おそらく

if (a->size == a->capacity) 
{ 
    /* resize array */ 
} 
a->array[a->size++] = v; 

... mallocまたは reallocなどを使用した結果を確認するために世話をして...

+0

ありがとうございます。しかし、私は2つの要素を挿入した後にa-> array [1]にアクセスしようとすると、まだsegfaultを取得しています。私の挿入コードにこれを引き起こしたことは何かありますか? –

+0

@ScottSinischo [最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)を作成して表示してください。これらの機能をどのように使用するか? –

+0

デバッガがsegfaultが起きていると言っている行を含めておけば助けになりますが、コードのままで別の問題に気づき、答えを更新しました。 –

関連する問題