&引用;未分配要释放的指针";在C中

&引用;未分配要释放的指针";在C中,c,pointers,memory-management,while-loop,C,Pointers,Memory Management,While Loop,我正在写一个从文件中读取行的程序。 但当我执行它时,我得到了这个错误: #包括“get_next_line.h” 无效ft_memdel(无效**ap) { 如果(ap!=NULL) { 免费(*ap); *ap=NULL; } } 无效ft_strdel(字符**as) { if(as!=NULL&*as!=NULL) ft_memdel((无效**)as); } 静态int-appendline(字符**s,字符**line) { 内伦; char*tmp; len=0; 而((*s)[le

我正在写一个从文件中读取行的程序。 但当我执行它时,我得到了这个错误:

#包括“get_next_line.h”
无效ft_memdel(无效**ap)
{
如果(ap!=NULL)
{
免费(*ap);
*ap=NULL;
}
}
无效ft_strdel(字符**as)
{
if(as!=NULL&*as!=NULL)
ft_memdel((无效**)as);
}
静态int-appendline(字符**s,字符**line)
{
内伦;
char*tmp;
len=0;
而((*s)[len]!='\n'&(*s)[len]!='\0')
len++;
如果((*s)[len]='\n')
{
*直线=ft_substr(*s,0,len);
tmp=ft_strdup(&(*s)[len+1]);
免费(*s);
*s=tmp;
如果((*s)[0]='\0')
圣彼得堡(s);
}
其他的
{
*直线=英尺标准高度(*s);
圣彼得堡(s);
}
申报表(1);
}
静态整数输出(字符**s、字符**行、整数ret、整数fd)
{
如果(ret<0)
返回(-1);
else if(ret==0&&s[fd]==NULL)
返回(0);
其他的
返回(追加行(&s[fd],行));
}
int get_下一行(常量int fd,字符**行)
{
int ret;
静态字符*s[FD_大小];
字符buff[缓冲区大小+1];
char*tmp;
如果(fd<0 | |行==NULL | | |!fd)
返回(-1);
而((ret=读取(fd、buff、缓冲区大小))>0)
{
buff[ret]='\0';
如果(s[fd]==NULL)
s[fd]=英尺标准高度(浅黄色);
其他的
{
tmp=ft_strjoin(s[fd],浅黄色);
自由(s[fd]);
s[fd]=tmp;
}
if(ft_strchr(s[fd],'\n'))
打破
}
返回(输出(s、行、ret、fd));
}
BUFF SIZE
变量在my
.h
文件中设置,程序应使用除负值或0以外的任何大小

a.out(51676,0x10ef9a5c0) malloc: *** error for object 0x7fb2e9402ea0: pointer being freed was not allocated
a.out(51676,0x10ef9a5c0) malloc: *** set a breakpoint in malloc_error_break to debug
run2.sh: line 3: 51676 Abort trap: 6           ./a.out

那么为什么不“在malloc\u error\u break中设置断点以进行调试”呢?这似乎比让读者费力阅读所有他们不知道的代码来找出你做错了什么要快。我投票决定关闭,因为这不是一个完整的例子,即no
main()
和从同一个源调用。您至少可以使用gdb或类似工具来确定哪个空闲是问题所在吗?所有的字符串都来自strdup吗?你没有修改分配和自由之间的任何指针,是吗?(我第一眼看不出这一点)添加一个main以使下划线愉快,那么这里的人可以更好地帮助您(例如使用调试器为您运行它)为什么不“在malloc\u error\u break中设置一个断点以进行调试”呢?这似乎比让读者费力阅读所有他们不知道的代码来找出你做错了什么要快。我投票决定关闭,因为这不是一个完整的例子,即no
main()
和从同一个源调用。您至少可以使用gdb或类似工具来确定哪个空闲是问题所在吗?所有的字符串都来自strdup吗?你没有修改分配和自由之间的任何指针,是吗?(我第一眼看不出这一点)添加一个main以使下划线愉快,那么这里的人可以更好地帮助您(例如,使用调试器为您运行它)