malloc的大空间结构,并像c中的数组一样访问它

问题描述 投票:0回答:3

我正在处理实现哈希表。我对哈希表的理解是,有一个像表一样的数组,你可以通过获取哈希值并按表大小修改它来快速访问元素。所以我最初的想法是宣布

Node *hTable [100];

哪里

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

并转到数组的索引和malloc属于那里的新元素。但是,问题是我需要增长我的桌子。

所以,我的问题是,我将如何创建一个动态表,但像数组一样访问它? (例如table[i])。

我知道你需要打电话

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

它允许你像表table[i] =...一样访问它,但如果我这样做,我不能在表的索引中声明一个新的Node

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 }
c arrays dynamic hash malloc
3个回答
2
投票

你的问题是如何为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
投票

它不需要是一个指针数组,您可以简单地创建一个节点数组,其中:

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

然后你可以访问list[i].slist[i].value

当你想要增长表时,你使用realloc()

new_list = realloc(list, sizeof *list * new_count);
if (new_list) {
    list = new_list;
} else {
    // report allocation failure
}

0
投票
 #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);
          }
 }
© www.soinside.com 2019 - 2024. All rights reserved.