2017-04-05 1 views
-3

printf ("pointeur =% p \ n", ligne);C Tableau de la structure de liste liée sur tas

Blockquote

Blockquote

+3

Qu'y a-t-il de si cool avec les pointeurs de typedefing ... vraiment? –

+0

@SouravGhosh - Sécurité du revenu. Cela rend le code tellement horrible que personne ne peut supporter le débogage, sauf soi-même. – StoryTeller

+0

Je n'ai aucune idée lol, le code squelette est venu comme ça, je pensais que c'était vraiment bizarre aussi – genericmathstudent

Répondre

2

Eh bien, le fait que le code est terriblement brouillées avec abus de typedef va probablement un long chemin vers les vôtres et les problèmes compilateurs. Je n'aurais pas un seul typedef dans ce programme moi-même. Il ne sert à rien d'abstraction réelle ici. Voici ce que je vous suggère (avec une omission de vérification d'erreur):

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; 
     } 
    } 
} 

choses importantes à noter:

  1. J'ai enlevé tous les typedefs. Ils n'ont servi à rien ici mais à essayer de sauver la frappe. Et ils l'ont fait au détriment de la qualité du code. Je l'ai également enlevé du struct, puisque je crois que la déclaration précédente s'applique à lui aussi.

  2. J'ai alloué de la mémoire de manière canonique. En écrivant malloc(sizeof(*pointer_variable)), vous allouez suffisamment de mémoire indépendamment de ce que pointer_variable points à. C'est un peu agnostique.

  3. Je traverse la liste chaînée avec l'idiome "traversée de lien". Au lieu de garder une trace du "nœud", je garde une trace du pointeur qui pointe sur le nœud. Au début c'est cache[i], et à chaque itération il devient le pointeur à l'intérieur du nœud nouvellement alloué.