2010-04-15 7 views
11

Ho un piccolo compito in C. Sto cercando di creare una serie di puntatori a una struttura. La mia domanda è come posso inizializzare ogni puntatore a NULL? Inoltre, dopo aver allocato memoria per un membro dell'array, non posso assegnare valori alla struttura a cui punta l'elemento dell'array.Come posso dichiarare e inizializzare un array di puntatori a una struttura in 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; 
} 

risposta

10

Qui:

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

sei dichiara un array di 10 puntatori a puntatori a vostra struct. Ciò che si vuole è un array di 10 puntatori a vostra struct:

list_node_t *array[10] = {NULL}; 

E 'confusa perché sì, array è davvero un puntatore a un puntatore, ma la piazza staffa notazione sorta di abstract che via per voi in C, e quindi dovresti pensare a array come a una serie di puntatori.

È inoltre non è necessario utilizzare l'operatore dereference su questa linea:

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

causa C dereferenzia per voi con la sua notazione staffa. Così dovrebbe essere:

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

Questa è una buona risposta, se non che 'array' è ** non ** "in realtà un puntatore a un puntatore". 'array' è in realtà un array, non un puntatore di alcun tipo. I tipi di matrice utilizzati in un'espressione vengono valutati in un puntatore al primo elemento dell'array, ma un array è ancora un tipo reale, distinto dai puntatori. 'sizeof array' dovrebbe aiutarti a convincerti che' array' non è un puntatore. – caf

+0

invece di 'array [0] = (list_node_t *) malloc (sizeof (list_node_t));' Va 'array [0] = malloc (sizeof (list_node_t));' non fare chiamate malloc typecast. –

2

La linea list_node_t **array[10] = {NULL}; è sbagliato - qui si dichiara array di puntatori a puntatori per elencare i nodi. Sostituirlo con:

list_node_t *array[10] = { NULL }; 

e dovrebbe funzionare.