2016-12-07 7 views
0

私は周りを見渡しましたが、この質問に対する回答は既に見つかりませんでした。私は各要素が構造体であるハッシュテーブルを作成しようとしています。各構造体には、セルが占有されているかどうかをプログラムに知らせるための変数があります。これを機能させるには、それらをすべてゼロに設定する必要があります。物事はうまく働いていますが、今では(一見ランダムに)私はアクセス違反を受けるでしょう。私はそれを修正したと思ったが、私のアレイを成長させるために来たときに、エラーが再び起き上がり、私がエラーを起こしたと信じさせた。私のポインタの知識はそれほど良くはないので、どんな助けもありがたいです。この関数は次のようになります。ゼロに動的に割り当てられた構造体の配列のメンバ要素を初期化

HashTableCell *initialiseTable(HashTableCell *hashTable, int *tableSizePtr) 
{ 
int i = 0; 
int totalSize = *tableSizePtr * sizeof(HashTableCell); 
HashTableCell *tempStartingcell; 

tempStartingcell = (HashTableCell*)malloc(sizeof(HashTableCell)); 
*tempStartingcell = *hashTable; 


while (i <= *tableSizePtr) 
{ 
    /*we keep moving forward, need to use the first entry*/ 
    *hashTable = *(tempStartingcell + (i * sizeof(HashTableCell))); 
    hashTable->isOccupied = 0; 
    i++; 
} 


free(tempStartingcell); 

return hashTable; 
} 

そして、私はテーブルのいくつかの領域をmallocさなどのような別の関数でそれを渡された前:

HashTableCell *hashTable; 
hashTable = (HashTableCell*)malloc((sizeof(HashTableCell)*tableSize)); 
hashTable = initialiseTable(hashTable, tableSizePtr); 

アイデアが始まり、移動時に開始することですwhileループの反復ごとに正しい数のスペースに沿って移動します。私がサイズを変更するとき、私は単にmallocされたスペースの2倍の新しい配列を作成し、それを初期化関数に渡しますが、これは一見ランダムなインデックスでアクセス違反エラーをスローします。

私はVS2015を使用しています。

ありがとうございました。

+0

を?あなたはデバッガを使いましたか? – qxz

答えて

3

問題は、この行である:あなたはポインタに整数を追加する場合

*hashTable = *(tempStartingcell + (i * sizeof(HashTableCell))); 

、CおよびC++は、すでに考慮に配列要素の大きさを取るので、あなたは(のsizeofを掛けるべきではありませんHashTableCell)が、むしろん:

*hashTable = *(tempStartingcell + i); 

そうでない場合は、あなたの余分な乗算はtempStartingCell配列の外のアクセスが発生します。

*hashTable = tempStartingcell[i]; 

しかし、あなたのコードはもっと間違っています。あなただけhashTableの各要素のためにゼロにisOccupiedを設定したい場合は、単に実行します。あなたのアクセス違反を与えている何行

void initialiseTable(HashTableCell *hashTable, int tableSize) 
{ 
    for (int i = 0; i < tableSize; i++) 
     hashTable[i].isOccupied = 0; 
} 
+0

これは主に意味があり、はるかに単純です。ありがとうございます。 私はあなたが必要なポインタのメンバにアクセスすると思っていました - >演算子ですか? – Thaeryn

+0

'hashTable [i]'は '*(hashTable + i)'と等価ですので、再度逆参照する必要はありません。 – Iluvatar

+0

この場合、hashTable [i] .isOccupiedと*(hashTable + i) - > isOccupiedは同じですか? – Thaeryn

関連する問題