2017-11-11 16 views
0

私は、この構造のメモリをどのように割り当てて解放するかを考え出すのに問題があります。この入れ子構造を割り当てる正しい方法は何ですか?

これを使用して、ニュートン補間で使用するFiniteTableを作成する必要があります。

typedef struct{ 
    unsigned int empty; 
    float value; 
}FiniteTableValue; 

実際の値を持つノードのようなものです。

typedef struct{ 
    FiniteTableValue *column; 
    unsigned int length; 
}FiniteTableRow; 

FiniteTableRowは、FiniteTableValuesの配列を保持します。

typedef struct{ 
    FiniteTableRow *row; 
    unsigned int length; 
}FiniteTable; 

FiniteTableは、FiniteTableRowsの配列を保持します。

typedef struct{ 
    FiniteTable *tables; 
    unsigned int length; 
}FiniteTableList; 

FiniteTableListは、私はvalgrindのとそれをdebuggしようとしたFiniteTableの

のリストであり、私はいつも、私は割り当てられませんでしたいくつかのアドレスにアクセスするようです。

また、これはすべての割り当てを解除する正しい方法ですか?あなたの解放例で

FiniteTableList *ftl ... 
    ... 
    for(int i = 0; i < ftl->length; i++){ 
    FiniteTable table = ftl->tables[i]; 
    for(int j = 0; j < table.length; j++){ 
     FiniteTableRow row = table.row[j]; 
     free(row.column); 
    } 
    free(table.row); 
    } 
    free(ftl->tables); 
    free(ftl); 
+0

valgrindのエラーは何ですか?未定義のデータが含まれている場合は '--track-origins = yes'を実行してみてください。 –

+0

「条件付きジャンプまたは移動は初期化されていない値に依存します」私はそれらがどこにあるのか知っていますが、mallocを使ってこれらの構造をすべて単純に開始するだけです。 – Felipe

+0

この場合、 '--track-origins = yes'はあなたが修正する必要のあるソースコードの場所を指すはずです。そうでない場合は、valgrindエラーとそれに対応するソースコードを投稿する必要があります。 –

答えて

1

Ftl目的は、FiniteTableListなくポインタ(FiniteTableList *)です。あなたがしたい場合は

/* Assuming every table in the list will have num_rows rows and num_columns columns. */ 
FiniteTableList * 
allocate_table_list (int num_rows, num_columns, int num_tables) 
{ 
    FiniteTableList * res = malloc (sizeof *res); 
    res->tables = malloc (num_tables * sizeof (*res->tables)); 
    res->length = num_tables; 
    for (int t = 0; t < num_tables; t++) 
    { 
     FiniteTable table = res->tables[t]; 
     table.row = malloc (num_rows * sizeof (*table.row)); 
     table.length = num_rows; 
     for (int r = 0; r < num_rows; r++) 
     { 
      FiniteTableRow row = table.row[r]; 
      row.column = malloc (num_columns * sizeof (*row.column)); 
      row.length = num_columns; 
     } 
    } 
    return res; 
} 

はあなたが置き換えることができます割り当てるメモリをゼロ初期化:

FiniteTableList ftl ... 

は、あなたがこのような何かをしたいFiniteTableList構造のためにメモリを割り当てるために:私はあなたが書くためのものだと思いますmallocへのコールcalloc

+0

FiniteTableList * res = malloc(sizeof * res)のときに何を割り当てていますか? ? – Felipe

+0

トップレベルのFiniteTableListオブジェクト用にメモリを割り当てています。 (sizeof * res)式は、「ポインタresが指し示す型のサイズ」を意味し、 – Kyrill

関連する問題