2

私は次の構造体を持っています:

typedef struct bucket {
    unsigned int contador; 
    unsigned int * valor;
} Bucket;

typedef struct indice {
    unsigned int bs;            
    unsigned int valor;      
    unsigned int capacidade; 
    Bucket * bucket;
} Indice;

typedef struct tabela {
    unsigned int bs; 
    Indice * indice;
} Tabela;

そして、私はこのようなことをしたい:

tabela->indice[2].bucket = &tabela->indice[0].bucket;

しかし、セグメンテーション違反が発生します。

tabela->indice[0].bucketアドレスを取得して に関連付けるにはどうすればよいですかtabela->indice[2].bucket

ありがとう!

4

2 に答える 2

2

私はおそらくacの質問に答えようとしたことで否定的な担当者を獲得するつもりですが、ここでは何も起こりません

を取り除いてみました&か?

tabela->indice[2].bucket = tabela->indice[0].bucket;
于 2012-11-07T22:52:22.380 に答える
2

有効なものを指すようにポインターを初期化する必要があります。構造体のインスタンスを作成するだけでは、それはできません。例えば:

Tabela t = {};  /* t is a valid, zero-initialized object, but indice is not valid */

t.indice = malloc(sizeof(Indice) * some_count);
/* now t.indice is valid */

for(int i = 0; i < some_count; ++i)
    t.indice[i].bucket = malloc(sizeof(Bucket));

/* now t.indice[0-(some_count-1)].bucket are all valid */

ところで、ポインタのコピーは正しくありません。

tabela->indice[2].bucket = tabela->indice[0].bucket;
/* assuming indices 0 and 2 are valid, this now works (but leaks memory)
   note that I removed the &.  It is incorrect and produces
   a Bucket** because t.indice[n].bucket is already a pointer */

ただし、メモリ リークが発生します。ここであなたが実際に何を達成しようとしているのかを理解するのは難しいです。

于 2012-11-07T22:52:31.693 に答える