2010-04-15 15 views
11

J'ai une petite affectation en C. J'essaie de créer un tableau de pointeurs vers une structure. Ma question est comment puis-je initialiser chaque pointeur sur NULL? En outre, après avoir alloué de la mémoire pour un membre du tableau, je ne peux pas affecter de valeurs à la structure à laquelle pointe l'élément de tableau.Comment puis-je déclarer et initialiser un tableau de pointeurs sur une structure en C?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct list_node list_node_t; 

struct list_node 
{ 
    char *key; 
    int value; 
    list_node_t *next; 
}; 


int main() 
{ 

    list_node_t *ptr = (list_node_t*) malloc(sizeof(list_node_t)); 

    ptr->key = "Hello There"; 
    ptr->value = 1; 
    ptr->next = NULL; 

    // Above works fine 

    // Below is erroneous 

    list_node_t **array[10] = {NULL};  

    *array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 
    array[0]->key = "Hello world!"; //request for member ‘key’ in something not a structure or union 
    array[0]->value = 22;   //request for member ‘value’ in something not a structure or union 
    array[0]->next = NULL;   //request for member ‘next’ in something not a structure or union 


    // Do something with the data at hand 
    // Deallocate memory using function free 

    return 0; 
} 

Répondre

10

ici:

list_node_t **array[10] = {NULL}; 

Vous êtes en déclarant un tableau de 10 pointeurs de pointeurs sur votre struct. Ce que vous voulez est un tableau de 10 pointeurs sur votre struct:

list_node_t *array[10] = {NULL}; 

Il est confus parce que oui, array est vraiment un pointeur vers un pointeur, mais le type de notation de support carré de résumés qui loin pour vous en C, et donc vous devriez penser à array comme juste un tableau de pointeurs.

Vous n'avez pas besoin d'utiliser l'opérateur de déréférencement sur cette ligne:

*array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 

Parce que C pour vous déréférence avec sa notation de support. Il doit donc être:

array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 
+4

C'est une bonne réponse, sauf que 'array' n'est pas ** ** ** vraiment un pointeur vers un pointeur. 'array 'est vraiment un tableau, pas un pointeur de quelque sorte que ce soit. Les types de tableau utilisés dans une expression sont évalués en pointant vers le premier élément du tableau, mais un tableau est toujours un type réel, distinct des pointeurs. 'sizeof array' devrait vous convaincre que' array' n'est pas un pointeur. – caf

+0

au lieu de 'array [0] = (list_node_t *) malloc (sizeof (liste_node_t));' ce devrait être 'array [0] = malloc (sizeof (list_node_t));' Ne pas typer les appels malloc. –

2

La ligne list_node_t **array[10] = {NULL}; est faux - ici vous déclarer tableau de pointeurs vers des pointeurs à la liste des noeuds. Remplacer cela par:

list_node_t *array[10] = { NULL }; 

et cela devrait fonctionner.