2010-04-15 40 views
11

Tengo una pequeña asignación en C. Intento crear una matriz de punteros a una estructura. Mi pregunta es ¿cómo puedo inicializar cada puntero a NULL? Además, después de asignar memoria a un miembro de la matriz, no puedo asignar valores a la estructura a la que apunta el elemento de la matriz.¿Cómo puedo declarar e inicializar una matriz de punteros a una estructura 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; 
} 

Respuesta

10

aquí:

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

usted está declarando un arreglo de 10 punteros a punteros a su estructura. Lo que queremos es un array de 10 punteros a su estructura:

list_node_t *array[10] = {NULL}; 

Es confuso porque sí, array realmente es un puntero a un puntero, pero la plaza soporte de notación tipo de resúmenes que lejos para que en C, y por lo que debería pensar en array como solo una serie de punteros.

También no es necesario utilizar el operador para deshacer referencias en esta línea:

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

Debido C elimina referencias para usted con su notación soporte. Por lo que debe ser:

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

Esa es una buena respuesta, excepto que 'array' es ** not **" realmente un puntero a un puntero ". 'array' es realmente una matriz, no un puntero de ningún tipo. Los tipos de matriz cuando se usan en una expresión se evalúan como un puntero al primer elemento de la matriz, pero una matriz sigue siendo un tipo real, distinto de los punteros. 'sizeof array' debería ayudar a convencerlo de que' array' no es un puntero. – caf

+0

en lugar de 'array [0] = (list_node_t *) malloc (sizeof (list_node_t));' debe ser 'array [0] = malloc (sizeof (list_node_t));' No encasquete las llamadas malloc. –

2

La línea list_node_t **array[10] = {NULL}; está mal - aquí se declaran matriz de punteros a punteros a la lista nodos. Reemplace eso con:

list_node_t *array[10] = { NULL }; 

y debería funcionar.

Cuestiones relacionadas