我正在创建一个程序,您可以在其中创建链接列表并修改/删除/添加/打印值,但我在测试时遇到了一些错误。 第一个是分段错误11:当你添加第四个值并且所有相等的值(1,1,1,1)时,尝试打印列表会让你遇到段错误,无法弄清楚原因。 第二个错误(目前):有时添加的第6个或第8个值将删除所有其他值,最后两个插入并在尾部放置0。
这是感兴趣的代码部分:
typedef struct list
{
int value;
struct list* next_ptr;
}tylist;
int main()
{
tylist *ptrptr;
ptrptr = NULL;
printf("\nI'm going to initialize the list now\n");
action(choicer(), &ptrptr);
return 0;
}
void insert_at_beg(tylist** ptrptr, int value)
{
if(*ptrptr != NULL)
{
tylist* tmp_ptr;
tmp_ptr = *ptrptr;
*ptrptr = (tylist*)malloc(sizeof(tylist));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
free(tmp_ptr);
}
else
{
printf("\nList is empty, that's your first entry\n");
*ptrptr = (tylist*)malloc(sizeof(tylist));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = NULL;
}
void action(int choice, tylist **ptrptr)
{
switch(choice)
{
int value;
case 1:
printf("\nValue: ");
scanf("%d", &value);
insert_at_beg(ptrptr, value);
action(choicer(), ptrptr);
break;
case 8:
visit_list(ptrptr);
action(choicer(), ptrptr);
break;
}
}
void visit_list(tylist **ptrptr)
{
while((*ptrptr) != NULL)
{
printf(" %d", (*ptrptr)->value);
ptrptr = &((*ptrptr)->next_ptr);
}
}
我故意删除了一些代码行,因为它似乎只有这么长时间,如果不清楚我会发布更多内容。
P.S。我很抱歉我的英语不好,我正在努力改进它。
答案 0 :(得分:0)
tmp_ptr = (tylist *)malloc(sizeof(tylist));
tmp_ptr = *ptrptr;
你刚刚将sizeof( tylist )
泄露在内存中。 (你在复制之后编辑了这个。)
哦,还有don't cast the result of malloc()
in C。
(*ptrptr)->next_ptr = tmp_ptr;
free(tmp_ptr);
您的next_ptr
现在指向free()
&n;内存。从此处对next_ptr
的任何访问权限(如visit_list()
)都是undefined behaviour。
int value;
case 1:
printf("\nValue: ");
scanf("%d", &value);
从不使用scanf()
来解析用户输入。 (使用fgets()
并解析内存。)
如果坚持使用scanf()
,至少检查返回代码 - 如果用户确实输入了非数字,此时value
可能未初始化。
return 0;
}
完成列表后,我没有看到任何释放内存的代码。在结束程序之前不free()
分配的内存是内存泄漏。那就是Windows或Linux恢复该内存,因为它们拆除程序的过程并没有改变你的程序泄露内存的事实。