尝试显示列表时出现分段错误
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。
我试图在 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。