Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文件中读取行时局部触发分段错误/不正确校验和_C_Unix - Fatal编程技术网

C 从文件中读取行时局部触发分段错误/不正确校验和

C 从文件中读取行时局部触发分段错误/不正确校验和,c,unix,C,Unix,我试图实现一个函数,从文件中获取每一行并打印它。出于某种原因,在运行它时,有时会出现分段错误,有时运行正常,有时会退出,对释放的对象的校验和不正确。我不知道哪个指针在释放后没有被释放/修改,我能得到一些线索吗 变量BUFFER\u SIZE是从键盘定义的,在这里我使用标志gcc-Wall-Werror-Wextra-D BUFFER\u SIZE=23 get\u next\u line.c main.c进行编译 #包括 #包括 #包括 字符*ft_strjoin(字符常量*s1,字符常量*s

我试图实现一个函数,从文件中获取每一行并打印它。出于某种原因,在运行它时,有时会出现分段错误,有时运行正常,有时会退出,对释放的对象的校验和不正确。我不知道哪个指针在释放后没有被释放/修改,我能得到一些线索吗

变量BUFFER\u SIZE是从键盘定义的,在这里我使用标志gcc-Wall-Werror-Wextra-D BUFFER\u SIZE=23 get\u next\u line.c main.c进行编译


#包括
#包括
#包括
字符*ft_strjoin(字符常量*s1,字符常量*s2)
{
char*s;
INTP;
int p2;
如果(s1==NULL | | s2==NULL)
返回(空);
s=malloc(strlen(s1)+strlen(s2)+1);
如果(s==NULL)
返回(空);
p=0;
while(s1[p])
{
s[p]=s1[p];
p++;
}
p2=0;
while(s2[p2])
{
s[p]=s2[p2];
p++;
p2++;
}
s[p]='\0';
申报表;
}
字符*ft\U新闻静态(字符*aux,字符*l,字符**行)
{
字符*温度;
内冷;
长度=斯特伦(l);
温度=malloc(冷+1);
strlcat(温度,l,strlen(温度)+(冷-strlen(辅助))+1);
*线路=标准升温(温度);
免费(临时);
l=零;
l=标准值(&aux[1]);
返回(l);
}
int get_下一行(int fd,字符**行)
{
静态字符*stc_行;
字符*缓冲区;
ssize_t nbytes;
char*aux;
stc_线=(!stc_线)?strdup(“”):stc_线;
缓冲区=malloc(缓冲区大小+1);
如果(!buffer | | fd 1)
{
i=0;
而(++i0)
{
printf(“[Return:%d]行#%d:%s\n”,ret,++行,buff);
免费(buff);
}
printf(“[Return:%d]行#%d:%s\n”,ret,++行,buff);
如果(ret==-1)
printf(“-------------\n错误\n”);
else if(ret==0)
printf(“--------------\n文件名”);
免费(buff);
}
}
如果(argc==1)
{
while((ret=get_next_line(0,&buff))>0)
printf(“[Return:%d]行#%d:%s\n”,ret,++行,buff);
如果(ret==-1)
printf(“-------------\n错误\n”);
else if(ret==0)
printf(“------------\n标准输入的名称”);
免费(buff);
关闭(fd);
}
返回(0);
}
这显然是错误的。由
malloc
分配的内存包含垃圾,因此对其调用
strlen
没有任何意义,试图使用
strlcat
附加到内存中会严重中断。例如,您分配的空间可能不包含尾随nul字节,在这种情况下,
strlen(temp)
将返回一个可能比
leng+1
大得多的数字,因此
strlcat
可能会超出分配的内存。或者,
strlen(temp)
可能只是简单地隔离故障

(我发现这是使用,然后注意到user3629249也注意到了评论中的错误。我强烈建议您在继续使用C之前学习使用valgrind或类似工具。)

我不能从你的代码中看出这个函数应该做什么;它有一个没有信息的名称,没有注释。但我认为您应该首先仔细指定它的预期行为,然后重写它

另请注意,在
argc==1
的情况下,
main
中存在严重的内存泄漏:

        while ((ret = get_next_line(0, &buff)) > 0)
            printf("[Return: %d] Line #%d: %s\n", ret, ++line, buff);
        /* ... */
        free(buff);
为每一行分配额外的空间,并且从未释放。只有最后一个被释放(在循环之外)。当我运行你的程序时,一个中等大小的输入文件使用了几GB的内存


在使用
strdup
分配从不释放的字符串的
get_next_\u行
中,还有一些其他内存泄漏。

也显示一个。您确定字符串以null结尾吗?如果它们不是,那么这些字符串函数可以在有效内存结束后访问。您应该能够逐步通过调试器来确认这一点。这看起来是错误的:
l=NULL;免费(l)如何执行
ft\u strdup
?您所指的“校验和”是什么,因为没有显示这样做的代码?如何调用
get\u next\u line
?输入文件的内容是什么?请提供一份完整的表格以及准确的输入。另外,哪一行代码触发seg错误-调试器可以告诉您。OT:about:
s=(char*)malloc(sizeof(char)*(strlen(s1)+strlen(s2)+1))1)返回的类型是
void*
,可以分配给任何指针。强制转换只会使代码混乱。建议去掉石膏。2) 表达式:
sizeof(char)
在C标准中定义为1。任何东西乘以1都没有效果。建议删除该表达式。3) 关于:
buffer=(char*)malloc(sizeof(char)*(buffer_SIZE+1))
缓冲区大小未定义
非常感谢您的帮助!我设法解决了这个问题
temp = malloc(leng + 1);
strlcat(temp, l, strlen(temp) + (leng - strlen(aux)) + 1);
        while ((ret = get_next_line(0, &buff)) > 0)
            printf("[Return: %d] Line #%d: %s\n", ret, ++line, buff);
        /* ... */
        free(buff);