Malloc большое пространство структуры и доступ к нему, как массивы в C - PullRequest
0 голосов
/ 21 января 2019

Я имею дело с реализацией хеш-таблицы. Насколько я понимаю, хеш-таблица состоит в том, чтобы иметь массив, подобный таблице, в которой вы можете быстро получить доступ к элементам, получив значение хеш-функции и изменив его по размеру таблицы. Итак, моя первоначальная мысль объявляла

Node *hTable [100];

где

typedef struct node {
    char *s; 
    int value;
} Node;

и переход к индексу массива и malloc нового элемента, который там находится. Но проблема в том, что мне нужно вырастить свой стол.

Итак, мой вопрос: как мне создать динамическую таблицу, но обращаться к ней как к массиву? (например, table[i]).

Я знаю, что вам нужно назвать что-то вроде

Node *table = (Node*)malloc(sizeof(Node)*size);

, который позволяет вам обращаться к ней как к таблице table[i] =..., но если я это сделаю, я не могу объявить новый узел в индексе таблицы

table[i]=(Node*)malloc(sizeof(Node));

Вот код, который я тестировал (получая ошибку seg), чтобы лучше понять проблему:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 typedef struct node {
  5         int data;
  6         struct node *next;
  7 } Node;
  8
  9
 10 void main() {
 11         Node **list;
 12         *list = (Node*)malloc(sizeof(Node)*10);
 13         for (int i = 0; i < 10; i++) {
 14                 list[i] = (Node*)malloc(sizeof(Node)); //problem here?
 15                 list[i]->data = i;
 16                 list[i]->next = NULL;
 17         }
 18         printf("printing...\n");
 19         for (int i = 0; i < 10; i++) {
 20                 printf("%d ", list[i]->data);
 21         }
 22 }

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Ваша проблема в том, как вы выделяете место для list.list неинициализирован и не указывает на допустимую память, вы должны сначала выделить для него место, а затем выделить место для каждого элемента:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
} Node;


int main() //return type of main is int
{
    Node **list;
    list = malloc(10 * sizeof *list); //allocate memory for list not *list, also no need to cast return value of malloc.
    for (int i = 0; i < 10; i++)
    {
        list[i] = malloc(sizeof *list[i]); //allocate space for each element.
        list[i]->data = i;
        list[i]->next = NULL;
    }

    printf("printing...\n");

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", list[i]->data);
    }

    return 0;
}
0 голосов
/ 22 января 2019

Это не обязательно должен быть массив указателей, вы можете просто создать массив узлов:

Node *list = malloc(sizeof *list * count);

Тогда вы можете получить доступ к list[i].s и list[i].value.

Когда вы хотите увеличить таблицу, вы используете realloc():

new_list = realloc(list, sizeof *list * new_count);
if (new_list) {
    list = new_list;
} else {
    // report allocation failure
}
0 голосов
/ 22 января 2019
 #include <stdio.h>
 #include <stdlib.h>

 typedef struct node {
         int data;
         struct node *next;
 } Node;


 int main() {
         // just initialize it this way ( previous was undefined behavior, dereferencing an initialize pointer)
         Node **list= malloc(sizeof(Node*)*10);
         for (int i = 0; i < 10; i++) {
                 list[i] = malloc(sizeof(Node*)); //problem here?
                 list[i]->data = i;
                 list[i]->next = NULL;
         }
         printf("printing...\n");
         for (int i = 0; i < 10; i++) {
                 printf("%d ", list[i]->data);
          }
 }
...