Как я могу объявить и инициализировать массив указателей на структуру в C?
У меня есть небольшое задание в C. Я пытаюсь создать массив указателей на структуру. Мой вопрос в том, как я могу инициализировать каждый указатель до NULL? Кроме того, после выделения памяти для элемента массива, я не могу назначать значения для структуры, к которой указывает элемент массива.
#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;
}
Ответы
Ответ 1
Здесь:
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));
Ответ 2
Строка list_node_t **array[10] = {NULL};
неверна - здесь вы объявляете массив указателей указателям на список узлов. Замените это следующим образом:
list_node_t *array[10] = { NULL };
и он должен работать.