инициализация структуры указатель на ноль - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь построить хеш-таблицу, используя следующий узел и таблицу:

typedef struct Node {
   int key;
   int value;
   int status;     
} Node;

typedef struct Table {
   int size;
   Node* node;
} Table;

node в структуре Table - это указатель Node, поэтому я подумал, что hasht(Table*)->node будетNode*.Я попытался инициализировать все node* в таблице NULL следующим образом:

for(int i=0;i<hasht->size;i++)
{
   hasht->node[i]=NULL;
}

Однако, когда я компилирую код, он выдает мне эту ошибку:

"несовместимые типы при назначении типу 'Node {aka struct Node}' из типа 'void *' hasht-> node [i] = NULL;"

Я не понимаю, почему hasht->node[i]это Node, а не Node*.Как я могу получить Node* член в переменной Table с Table*?

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Вы уверены, что хотите инициализировать указатель структуры на NULL?

Я попытался инициализировать все узлы * в таблице в NULL следующим образом:

Есть только один указатель, и я полагаю, вам нужно выделить для него немного памяти:

hasht->node = calloc(hasht->size, sizeof(Node));
0 голосов
/ 26 мая 2018

Ваш индекс не в том месте.Вам нужно

hasht[i]->node=NULL; (а не hasht->node[i]=NULL;)

0 голосов
/ 26 мая 2018

hasht->node - это Node *, который может быть указателем на один Node или указателем на массив Node объектов.hasht->node[i] затем ссылается на i th Node объект в таком массиве.Обратите внимание, что по определению для указателя p, p[i] эквивалентно *(p + i).

Если вы хотите, чтобы ваша таблица имела массив узлов, вы можете использовать ее как есть, но затемнет ничего, что можно обнулить, потому что в таблице есть действительные Node объекты.

Если, с другой стороны, вам нужен массив указателей на узлы по некоторым причинам, выВам нужно будет изменить член таблицы на Node **node.Затем вы можете указать на массив указателей на Node, которые действительно могут быть обнулены по отдельности (поскольку hasht->node[i] будет Node * тогда).Вы получите фрагментацию памяти и будете недружелюбны к кешу.

...