Как я могу объявить и инициализировать массив указателей на структуру в C?

У меня есть маленькое присвоение в 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;
}
13
задан user246392 15 April 2010 в 01:14
поделиться

2 ответа

Здесь:

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

Вы объявляете массив из 10 указателей на указатели на вашу структуру. Вам нужен массив из 10 указателей на вашу структуру:

list_node_t *array[10] = {NULL};

Это сбивает с толку, потому что да, array действительно является указателем на указатель, но квадратные скобки представляют собой абстракции, которые вам не нужны в C , поэтому вы должны думать о array как о массиве указателей.

Вам также не нужно использовать оператор разыменования в этой строке:

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

Потому что C разыменовывает его за вас с помощью обозначения скобок. Так должно быть:

array[0] =  (list_node_t*) malloc(sizeof(list_node_t));
13
ответ дан 2 December 2019 в 00:17
поделиться

Строка list_node_t ** array [10] = {NULL}; неверна - здесь вы объявляете массив указателей на указатели для узлов списка . Замените это на:

list_node_t *array[10] = { NULL };

, и он должен работать.

2
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: