2011-12-14 16 views
-1

構造体ポインタの配列をどのように初期化するかがわかりません。 基本的に何をしたいのですか?構造体ポインタの配列をループし、各ポインタに対して何らかの作業をしたいのです。構造体ポインタを設定する

構造のためのコード:

typedef double Align; 
union header { 
    struct { 
     union header * p, *prev; 
     unsigned size; 
    } s; 
    Align x; 
}; 

typedef union header Header; 

と私は仕事に行くことができないコードは以下の通りです:

Header * freelist[NRQUICKLISTS]; /* Listan med */ 

void init() { /* call this once in the beginning */ 
    int i; 
    for (i = 0; i < NRQUICKLISTS-1; i++) { 
     freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */ 
     freelist[i]->s.size = 0; 
    } 
    freelist[i] = &base; 
    freelist[i]->s.p = freep = &base; /* cirkulär lista */ 
    freelist[i]->s.size = 0; 
} 
+2

ます配列の要素を使用していますそのオブジェクトのためのメモリを割り当てずに、オブジェクトへのポインタとして。 –

答えて

1

あなたが使用する前にポインタにメモリを割り当てる必要がありますそれら: - 代わりstd:vectorを使用している。また

for (i = 0; i < NRQUICKLISTS-1; i++) { 
    freelist[i] = new Header; 
    freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */ 
    freelist[i]->s.size = 0; 
} 

、私はあなたがそれを行うC++の方法を提案しますアレイの

編集:Cについては

、malloc関数を使用します。

for (i = 0; i < NRQUICKLISTS-1; i++) { 
    freelist[i] = malloc(sizeof(Header)); 
    freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */ 
    freelist[i]->s.size = 0; 
} 
+0

Cで 'new'を使うことはできません – Dani

+0

C言語でnewを使うことはできません。質問は、私が答えを投稿したときにC++とタグ付けされました。 –

+0

ああもちろん私。どうもありがとうございました! –

0

あなたは各ポインタに割り当てる必要があります。

for (i = 0; i < NRQUICKLISTS-1; i++) 
{ 
    freelist[i] = malloc(sizeof(Header)); 
    freelist[i]->s.p = freelist[i]; 
    freelist[i]->s.size = 0; 
} 

または代わりに連続したストレージを使用する:

Header freelist[NRQUICKLISTS]; 

for (i = 0; i < NRQUICKLISTS-1; i++) 
{ 
    freelist[i].s.p = freelist + i; 
    freelist[i].s.size = 0; 
} 
関連する問題