2011-08-24 6 views
-1

コードについてC言語:なぜ私はNULLを取得するのですか?

tpは、テーブルを含む特定の構造体へのポインタです。

テーブルは、異なる構造体のポインタへのポインタであり、配列として使用されます。

サイズは表のサイズにすぎません。 NULLに

アレイ内のすべてのセルを初期化するために機能するこれらveriablesを送信

イム。

このライン:

initArr(tp->table,tp->size); 

がこの機能に送信します:

Eclipseのデバッガを使用して
void initArr(ObjectP* array,int size) 
{ 
    int i; 
    for (i = 0; i < size; ++i) 
    { 
     array[i]=NULL; 
    } 
} 

私は、配列内のオブジェクトがNULLに初期化されている

Infactはされていることがわかりますメソッドが終了したら、

tp-> tableがNULLです。

ポインタがワイルドになった?

助けてください。

構造体:

テーブル:

typedef struct Table 
    { 
     size_t size; 
     hashFcn hash; 
     printFcn print; 
     comparisonFcn comp; 
     ObjectP* table; 
     int duplicated; 
    }Table; 

オブジェクト:

typedef struct Object 
    { 
     void *key; 
     ObjectP pointsTo; 
    }Object; 
+2

これはどちらですか? CまたはC++?私があなたに与えるアドバイスは、それがどれであるかによって非常に異なる*でしょう。 – Flexo

+1

'struct'を投稿してください。 –

+0

なぜ 'void'を返す関数で何かを返すのですか? – Constantinius

答えて

0

配列とポインタは似ていますが、異なっています。

ポインタの配列は、メモリ内の連続するポインタの数(配列内の最初のポインタが存在するアドレス)で表すことができます。

このような状況では、tp-> tableはtp-> table [0]とまったく同じですが、(同じアドレスを持つため)[0]とみなされます。このように実装されたシステムでは、tp->テーブルはアドレスを指定し、そのアドレスからのオフセット(配列の要素に到達する)は、データ型のサイズ(またはポインタのサイズ場合)。

tp->table (the base address 0x00000100) 
tp->table[0] (the address 0x00000100 + 0 * sizeof(... pointer ...) = 0x00000100) 
tp->table[1] (the address 0x00000100 + 1 * sizeof(... pointer ...) = 0x00000104 (some systems only)) 
tp->table[2] (the address 0x00000100 + 2 * sizeof(... pointer ...) = 0x00000108 (some systems only)) 

だからあなたのデバッガは、実際には[0]あなたのコンパイラの実装に応じて、TP->テーブルとまったく同じであるTP->テーブルをプリントアウトすることがあります。

0

コード提示として(あなたはvoid関数から何かを戻ってきている!)間違っているようだが、私は」あなたの実際のコードでは、initArrの中に何か(おそらくmalloc経由で)を "配列"に設定しようとしていると仮定します。この場合、古典的な問題があります:tp-> table値によって、それはinitArrによって変更されませんので:initArrはinitArr終了時に破棄されるTP->テーブルのローカルコピー上で動作:)

編集:

いやはや - 今、あなたはしました私の推測が間違っていたように見える。 :/私はそれを右に持っていたら賞を想像してください! :)

+0

私のコードを編集しましたが、間違いでした。 – Itzik984

関連する問題