【问题标题】:Simple C trie program goes wrong (segmentation fault) [closed]简单的 C trie 程序出错(分段错误)[关闭]
【发布时间】:2016-03-31 19:10:09
【问题描述】:

为了理解 Trie,我创建了一个非常简单的 C 程序,它从用户 0 到 9 的 10 个 nums 作为 trie 的子节点。最后一步是用函数print 打印这个数字,但我遇到了分段错误:

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

typedef struct list
{
    int data;
    struct list *ar[10];
} list;

void insert(list *head);
void print(list *head);

int main(void)
{
    printf("hello\n");
    list *root = malloc(sizeof(list));

    insert(root);
    print(root);    
}

void insert(list *head)
{
    int a, i;

    if (head == NULL) {
        return;
    }

    for (i = 0; i < 10; i++) {
        printf("Give Num 0-9\n");
        scanf("%i", &a);
        head->ar[a] = malloc(sizeof(head));
        head = head->ar[a];
        head->data = a;
    }
}

void print(list *head)
{
    if (head == NULL) {
        return;
    }

    while (head != NULL) {
        for (int i = 1; i < 10; i++) {
            if (head->ar[i] != NULL) {
                printf("%i", i);
                head = head->ar[i];
                break;
            }
        }
    }
    printf("\n");
}

【问题讨论】:

  • 你从来没有真正检查过scanf的返回值或者a是否保持在0-9之间
  • malloc()分配的对象未初始化。您只为root-&gt;arr[a] 写入一个有效值,但尝试读取(如果它们为非空,则取消引用)数组中的所有指针。
  • 为了简单起见,我以这种方式制作,我得到了正确值的段错误
  • 另外,您只是分配指针的大小,而不是实际的列表结构! - 也许你的意思是malloc(sizeof(list))
  • @Spyreto:在这种情况下,您需要提供一个更好的示例。通过使用未初始化的值,您提供的显然表现出未定义的行为。

标签: c trie


【解决方案1】:

您的代码有几个问题:

  1. 第一次提到malloc 实际上并没有初始化内存(ar 字段)。你应该正确初始化它

    list *root = malloc(sizeof(list));
    

    缺少初始化,例如

    root->data = 0;
    for (size_t ii = 0; ii < 10; ii++) {
        root->ar[ii] = NULL;
    }
    
  2. 当您实际收集输入时,您只会为 指针 分配足够的内存,而不是为实际列表本身分配足够的内存。

    head->ar[a] = malloc(sizeof(head));
    

    应该像上面那样初始化(head = malloc(sizeof(list)); for (size_t ...

  3. 实际运行您的程序时似乎存在无限循环(在更正所有这些问题之后)。

编辑:删除calloc...

【讨论】:

  • calloc() 不适合指针,因为没有要求 NULL 按位为零。不提倡不可移植的代码。
  • %i is fine,可以说比%d 更好,但在这种特殊情况下可能有点矫枉过正。它做了%d 所做的事情,加上处理base 16 和base 8 输入。
  • 哇,我本可以经历多年从未听说过%i。哦,好吧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2012-09-16
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多