2011-06-25 3 views
0

は、このコードを見てみましょう:言語C:代入文がデータを破壊するのはなぜですか?

void insert(Poly **A, int degree, int coef2) { 
    heapSize = heapSize+1; 
    Poly *key; 

    if (heapSize == 1) {  // heap was originally empty 
     key->coef = coef2; 
     key->degree = degree; 
     A[heapSize-1] = key; 
     return; 
    } 

    // create an "minus infinity" degree poly 
    int keyDegree = degree; 

    key->coef = coef2; 
    key->degree = MIN_INT; 

    A[heapSize-1] = key ; 
    heapIncreaseKey(A, heapSize-1, keyDegree); 
} 

ポリは、そのメンバーint型の両方がある構造体です。 "A"はポリポインタの配列です。 "A [heapSize-1] = key"(ifブロック内)の文が実行されるたびに、何らかの理由で "key"のメンバーが "junk"値に変わります。例えば、その文が実行される直前に、 "key"のメンバの値は5と6になります。この文が実行されると、値は8桁のジャンク番号に変わります。なぜ誰かが私に言うことができますか?ありがとう

答えて

2

keyは初期化されていないポインタであり、それを逆参照して、それがポイントする存在しない場所に値を割り当てます。これはvalgrindによって捕らえられていただろう。

4
あなたは key宣言

key = malloc(sizeof(Poly)); 

が欠落している

はあなたにポインタを与えるが、それは、有効な場所を指していません。 Dereferencing keyは未定義の動作を引き起こします。 Aがヒープへのポインタである一方、heapsizeがグローバル定数であるよう

EDIT

また、それが見えます。非グローバルのサイズを記録するグローバル変数を持つことは奇妙に思えます。

Aと同じスコープの変数になり、Aを扱う関数の引数としてポインタを渡します。

+0

お返事ありがとうございます!何が言いたいのか理解した。問題は、私はアルゴリズムを "キャッシュ効率"にする必要があるということです。ヒープ上に構造体を割り当てるという事実は、私のシステムがより効率的にキャッシュを使用するかどうかに影響しますか? – alguru

0

キーは初期化されていないポインタであり、そのキーに書き込んでいます。

この方法では、未定義の動作が強くなります。

0

キーは何も指していません。また、割り当てられた長さ 'A'は提供されません。 あなたは 'malloc'などで骨を張ってお勧めします:)

0

あなたはポインタを使用する前にmallocする必要があります:)!

1

キーのメモリを割り当て、A配列のシグネチャを渡すサイズを変更します。 heapsizeが依然としてAの割り当て範囲内にあることを確認してください。 Polyの配列内のポインタではなく構造体を保持するためにリファクタリングする場合、キー変数は必要ありません。次に、あなたの2つの入力をAに直接入力することができます。 A [heapSize] .coef = coef2; また、最初の行でインクリメントせずに関数内でheapSizeを使用し、終了点でインクリメントするだけで、少し単純化できます。この方法では、どこでもheapSize-1を使用する必要はありません。

+0

私はここで効率が心配であることに気付きました。ヒープに割り当てられたポインタの配列を持つgrapevine構造は、ほとんど効率的ではありません。ポインターの配列ではなく、配列を前もって割り当てる配列を残すことができるかどうかを確認してください。 –

+0

ええ、大規模なデータを処理するため、コードでキャッシュを効率的に使用するようにしなければなりません。アドバイスありがとう:) – alguru

関連する問題