尝试显示列表时出现分段错误

segmentation fault when trying to display a list

我试图在 C 中显示一个列表,但是当我这样做时出现了段错误。 Valgrind 告诉我这是因为我试图达到未初始化的值,你能帮我吗?

显示列表的函数(第 7 行的段错误):

void display_list(struct list *list)
{
    struct list *tmp;

    tmp = list;
    my_printf("liste =");    
    while (tmp != NULL) {
        my_printf(" %d", tmp->number);
        tmp = tmp->next;
    }
    my_printf("\n");
    free(tmp);
}

列表结构:

struct list
{
    int number;
    struct list_a *next;
};

主要功能:

int main(int argc, char **argv)
{
    struct list *list_a;
    struct list *list_b;
    for (int i = 1; i < argc; i++) {
        add_item(&list_a, my_getnbr(argv[i]));
    }
    display_list(list_a);
    free(list_a);
    free(list_b);
    return (0);
}
int add_item(struct list **list, int item)
{
    struct list *element = malloc (sizeof(*element));

    if (element == NULL)
        return (EXIT_FAILURE);
    element->number = item;
    element->next = *list;
    *list = element;
    return (0);
}
int my_getnbr(char const *str)
{
    int i = 0;
    int nbr = 0;

    if (str[0] == '-' && str[1] != '[=14=]')
        i++;
    for (i; str[i] != '[=14=]'; i++) {
        if (str[i] < '0' || str[i] > '9')
            write(2, "there must be only numbers in the string", 40);
        nbr = nbr + str[i] - 48;
        nbr = nbr * 10;
    }
    nbr = nbr / 10;
    if (str[0] == '-')
        return (-1 * nbr);
    else
        return (nbr);
}

在您的 main 函数中,您在 list_b 上调用 free,但它是未初始化的,这意味着它的有效值为 不确定。尝试在此类指针上调用 free 会调用 undefined behavior,这会导致崩溃。

删除对 free 的调用,实际上完全删除 list_b,因为它未被使用。

此外,在 display_list 末尾调用 free 没有意义,因为您不需要在这里清理任何内存。你逃脱了它,因为此时 tmp 的值为 NULL,并且在 NULL 指针上调用 free 是空操作。

您还有 list_a 未初始化。这会导致您的列表末尾有一个无效指针。您应该将其初始化为 NULL。