2017-04-05 8 views
-3

printf( "pointer =%p \ n"、行);Cヒープ上のリンクリスト構造体の配列

BLOCKQUOTE

BLOCKQUOTE

+3

ポインタをtypedefingするのはとてもクールです...本当ですか? –

+0

@SouravGhosh - 収入のセキュリティ。それは誰もがそれをデバッグするために立つことができないように1つのコードをとてもひどいものにします。 – StoryTeller

+0

私は笑わない、骨格のコードはそのようになった、私はそれも本当に奇妙だと思った – genericmathstudent

答えて

2

まあ、コードがひどくtypedefの乱用に難読化された事実は、おそらくあなたとコンパイラの問題の両方に向けて長い道のりを行きます。私は自分自身でこのプログラムに単一のtypedefを持っていないでしょう。ここでは実際の抽象化はありません。ここで私は(エラーチェックの一部省略して)ことをお勧めしたいものです。注意すべき

struct cache_line { 
    char valid; 
    mem_addr_t tag; 
    struct cache_line* next; 
}; 

struct cache_line** cache; 

void initCache() 
{ 
    cache = malloc (sizeof(*cache) * S); 
    for (int i = 0; i < S; i ++){ 
     struct cache_line** curr_p = &cache[i]; 
     for (int j = 1; j < E; j++){ 
      *curr_p = malloc(sizeof(**curr_p)); 
      (*curr_p)->valid = 0; 
      (*curr_p)->tag = 0; 
      (*curr_p)->next = NULL; 
      curr_p = &(*curr_p)->next; 
     } 
    } 
} 

主なもの:

  1. 私はすべてのtypedefを削除しました。彼らはここで本当の目的を果たしたのではなく、タイピングを助ける試みでした。そして、彼らはコード品質を犠牲にしてそれをやりました。私は前の声明もそれにも当てはまると信じているので、structから削除しました。

  2. 私は標準的にメモリを割り当てました。 malloc(sizeof(*pointer_variable))を書くことで、pointer_variableが何を指しているかにかかわらず、十分なメモリを割り当てます。それは幾分型にとらわれない。

  3. "リンクトラバーサル"イディオムでリンクリストをトラバースします。 「ノード」を追跡する代わりに、ノードを指しているポインタを追跡します。最初はcache[i]であり、繰り返しごとに新しく割り当てられたノード内のポインタになります。