【问题标题】:Malloc large space of struct and accessing it like arrays in cMalloc 结构的大空间并像 c 中的数组一样访问它
【发布时间】:2019-06-15 07:09:21
【问题描述】:

我正在处理实现一个哈希表。我对哈希表的理解是,拥有一个类似表格的数组,您可以通过获取哈希值并通过表格大小对其进行修改来快速访问元素。所以我最初的想法是声明

Node *hTable [100];

在哪里

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

并转到数组的索引并分配一个属于那里的新元素。但是,问题是我需要增加我的表。

所以,我的问题是,我将如何创建一个动态表,但像访问数组一样访问它? (例如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 }

【问题讨论】:

  • Node **list; *list = ... 已经是未定义的行为。 list 未初始化,您取消引用它。
  • list = malloc(sizeof(*list)*10);
  • 您可以使用realloc() 扩大您的表格。不管是Node的数组还是Node*的数组都是一样的。
  • 请不要粘贴带有行号的代码,这样会让人难以复制粘贴代码。

标签: c arrays dynamic hash malloc


【解决方案1】:

您的问题是如何为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;
}

【讨论】:

  • 你能解释一下 10 * sizeof list 吗?它与 10*sizeof(Node) 有何不同?
  • @user10416282 在本例中sizeof (Node)sizeof *list 是相等的,但是如果您更改list 的类型,您还必须在malloc 参数中更改它,否则可能导致到错误。因此我更喜欢这种方式。
【解决方案2】:

它不需要是一个指针数组,你可以简单地制作一个节点数组,用:

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
}

【讨论】:

    【解决方案3】:
     #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);
              }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多