SEGFAULT尝试从管道读取fgetc
目前,我有一个给孩子的父进程管道信息,并通过SEGFAULT尝试从管道读取fgetc,c,process,segmentation-fault,fgetc,C,Process,Segmentation Fault,Fgetc,目前,我有一个给孩子的父进程管道信息,并通过fgetc读取他们的标准输出。我循环了几轮,使用fdopen存储第一轮的文件指针,并在下一轮中再次调用它 问题是,在第一轮中,read\u行的读取结果非常精细,但在第二轮中,fgetc遇到SEGFULT 错误消息: Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7791330 in __GI___uflow (fp=0x6041b0) at genops.c:381 38
fgetc
读取他们的标准输出。我循环了几轮,使用fdopen
存储第一轮的文件指针,并在下一轮中再次调用它
问题是,在第一轮中,read\u行
的读取结果非常精细,但在第二轮中,fgetc遇到SEGFULT
错误消息:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7791330 in __GI___uflow (fp=0x6041b0) at genops.c:381
381 return *(unsigned char *) fp->_IO_read_ptr++;
阅读功能:(我知道这不是最好的)
澄清。它第一次起作用。为什么第二天就不行了?
许多其他问题似乎只是有一个不同的错误
char* read_line(FILE* file,int currentP, Players *players) {
char* result = malloc(sizeof(char) * 80);
int position = 0;
int next = 0;
for (int i = 0; i < players->players[currentP].position; i++) {
next = fgetc(file);
}
while (1) {
next = fgetc(file);
//players->players[currentP].position++;
if (next == '!') {
return "!";
}
if (next == EOF || next == '\n') {
result[position] = '\0';
return result;
} else {
result[position++] = (char)next;
}
}
}
char*read_行(文件*FILE,int-currentP,播放器*Players){
char*result=malloc(sizeof(char)*80);
int位置=0;
int next=0;
对于(int i=0;iplayers[currentP]。位置;i++){
next=fgetc(文件);
}
而(1){
next=fgetc(文件);
//玩家->玩家[currentP]。位置++;
如果(下一步=='!'){
返回“!”;
}
如果(next==EOF | | next=='\n'){
结果[位置]='\0';
返回结果;
}否则{
结果[位置++]=(字符)下一步;
}
}
}
如果没有检查缓冲区溢出,则可能存在重复。当在调试器中捕获崩溃时,它发生在代码的何处?您读取的输入是什么?如何调用函数?请尝试创建一个。另外,请。可能文件处理程序已关闭,您试图从损坏的处理程序中读取。因此,错误不在函数中,而是在上面的代码中。警告,当返回“!”
时,您丢失了分配内存的位置,并且您将无法释放()
whatread\u line
returns。问题是我的结果变量没有被memset设置回空字符串,因此它遇到了segfault。添加memset解决了我的问题,但我将尝试修复内存泄漏。可能的副本没有检查缓冲区溢出。当在调试器中捕获崩溃时,它发生在代码的何处?您读取的输入是什么?如何调用函数?请尝试创建一个。另外,请。可能文件处理程序已关闭,您试图从损坏的处理程序中读取。因此,错误不在函数中,而是在上面的代码中。警告,当返回“!”
时,您丢失了分配内存的位置,并且您将无法释放()
whatread\u line
returns。问题是我的结果变量没有被memset设置回空字符串,因此它遇到了segfault。添加memset解决了我的问题,但我将尝试修复内存泄漏。