2016-09-08 25 views
1

私はできるだけ簡潔にしようとします。 だから、私は2つの構造体があります。今、これは編集不可のコードで、上記のすべての可能なミスを違いを無視、構造体のポインタからの構造体の値へのアクセス

typedef struct someStruct named; 
struct someStruct { 
    void *key;     
    void *value;      
}; 
typedef struct anotherStruct namedToo; 
struct anotherStruct { 
    named **table;   
    unsigned int size;   
}; 

オーケー偉大を。

namedToo *init(float ignoreThis) { 
    namedToo *temp; 
    temp = malloc(sizeof(namedToo)); //some memory for the second struct 
    temp->table = malloc(sizeof(named)*100); //lets say this 100 is for 100 buckets/cells/named elements 
    return temp; 

方法2:

は今、私は2つの方法を持っている

int insert(namedToo *temp, void* key, void* value) { 
    temp->table[0]->key = key; //My problem, I need to access the value and key inside named from the pointer inside namedToo. How can I do this? 
} 

をコメントは私の問題があります。 私の問題は、私はポインタから名付け内の値とキーにアクセスする必要があります内部のnamedToo。これどうやってするの?私は時々彼ら自身の価値/キーを変更して取得する必要があります。

+1

名前 'table'は、1次元配列ではなく2次元配列として扱うべきであることを示しています。それは事実ですか? – dbush

+0

その可能性はありますが、必要ではありません。なぜなら、その理由は、ハッシュテーブル/マップの残りの部分があるからです。最初の構造体には別個の連鎖のための別の要素を指すポインタがありますが、ここには含まれていません。使用される名前は完全に任意であると仮定します。 @dbush – Monkleys

+0

'init'はポインタへのポインタとして' table'を正しく初期化しません。 – aschepler

答えて

3

named **table;は、namedへのポインタ、またはnamedへのポインタの配列へのポインタを指しています。tableは、ポインタへのポインタです。後者はあなたが意図しているようです。

この割り当て:100 namedため

temp->table = malloc(sizeof(named)*100); 

割り当てスペースが、何が必要では100 named *あり、そしてそれらのそれぞれは、namedを指している必要があります。 namedの定義を考えると、これは十分なスペースである可能性が高いですが、この時点では初期化されていないポインタの配列があります。それらにアクセスしようとするとundefined behaviorになります。この場合、コアダンプとして現れます。

ポインタの配列のためのスペースを割り当ててから、それらをそれぞれ動的に割り当てられたnamedのインスタンスに初期化する必要があります。だから、このようにスペースを割り当てるべきである:

int i; 
temp->table = malloc(sizeof(named *)*100); 
for (i=0; i<100; i++) { 
    temp->table[i] = malloc(sizeof(named)); 
} 

次に、あなたのinsert方法が適切に動作するはずです。

+0

うん、それはそれを要約する。代わりに割り当てられている構造体を使用するポインタの代わりの割り当ては 'temp-> table = malloc(sizeof *(temp-> table)* 100);' –

+0

@dbushです。これは私の問題を解決します。ありがとうございました。この場合、(名前*)と(名前)の違いは何ですか、なぜ両方にスペースを割り当てる必要があるのか​​を理解するだけです。申し訳ありませんが、Cの新機能です。ポインタやメモリの割り当ては、Javaからの理解には本当に挑戦的です。 – Monkleys

+0

@Monkleys 'named *'は 'named'へのポインタであり、' named'は構造体自体のインスタンスです。 'table'は' named ** 'として定義されているので、2つのセットの割り当てが必要です。つまりポインタへのポインタです。 – dbush

関連する問題