gpt4 book ai didi

c - 尝试实现我自己的列表时出现内存错误

转载 作者:行者123 更新时间:2023-11-30 18:37:57 27 4
gpt4 key购买 nike

我正在尝试在 C 中实现我自己的类似链表的结构,但是即使是最简单的部分(仅将新元素添加到列表中)我也失败了。将一个元素添加到列表中并打印它可以正常工作,添加另一个元素并打印该元素则不行。执行后,控制台只是输出“内存错误” - 就是这样。我很确定我在 insert_list 函数中弄乱了当前指针的迭代,但我找不到位置。

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

#define MAXLEN 80

typedef struct list
{
struct list *next;
char value[MAXLEN];
} list;

void insert_list(list *lis, const char string[MAXLEN])
{
list *current = lis;
while(current->next)
{
current++;
}
current->next = malloc(sizeof(lis));
strcpy(current->next->value, string);
}

int main(void)
{
list lis =
{
NULL,
"Hello1"
};
insert_list(&lis, "Hello2");
insert_list(&lis, "Hello3");
/* This still works */
printf("%s %s", lis.value, lis.next->value);
/* This doesn't */
printf("%s", lis.next->next->value);

return 0;
}

最佳答案

current->next->next 从未在 insert_list 中初始化,因此第二次调用 insert_list 时,它可能会永远迭代,直到内存错误。

void insert_list(list *lis, const char string[MAXLEN])
{
list *current = lis;
while(current->next)
{
current++;
}
current->next = malloc(sizeof(lis));
current->next->next = NULL;
strcpy(current->next->value, string);
}

编辑

实际上还有很多其他错误,不仅仅是 init:

  1. 推进列表,可能应该是 current = current->next,而不是 current++
  2. malloc 应该是 sizeof list 而不是 lis,第一个是列表中的条目大小,但 sizeof(lis) 将是大小机器上的指针
  3. const char string[MAXLEN] 作为参数并不意味着您所认为的含义;-) 请参阅 Difference between passing array and array pointer into function in C

关于c - 尝试实现我自己的列表时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com