Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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程序在fclose期间接收到信号SIGSEGV_C_Fclose - Fatal编程技术网

C程序在fclose期间接收到信号SIGSEGV

C程序在fclose期间接收到信号SIGSEGV,c,fclose,C,Fclose,我是一个来自遥远过去的锈迹斑斑的C程序员。具有打开二进制文件的代码(包含有关产品的详细信息,例如id、价格等)。文件名是调用.out程序(当前在Ubuntu 12.04 w/gcc上运行)时的输入参数。编译没有错误的文件。运行时,打开文件,将数据放入结构(与二进制文件中的数据字段相匹配),以简单的列方式打印所有数据字段(没有花哨的格式,只有一列内容,每个列对应于命令行中包含的每个文件)。然后通过fclose关闭文件指针。在测试中,一切正常,直到FCF失败。最后一个fclose(最后一个文件指针关

我是一个来自遥远过去的锈迹斑斑的C程序员。具有打开二进制文件的代码(包含有关产品的详细信息,例如id、价格等)。文件名是调用.out程序(当前在Ubuntu 12.04 w/gcc上运行)时的输入参数。编译没有错误的文件。运行时,打开文件,将数据放入结构(与二进制文件中的数据字段相匹配),以简单的列方式打印所有数据字段(没有花哨的格式,只有一列内容,每个列对应于命令行中包含的每个文件)。然后通过fclose关闭文件指针。在测试中,一切正常,直到FCF失败。最后一个fclose(最后一个文件指针关闭)导致分段错误。当第四个文件指针尝试fclose时,运行gdb(例如有4个输入文件)会输出以下内容:

程序接收信号SIGSEGV,分段故障。 0xb7e95ac6英寸??()来自/lib/i386 linux gnu/libc.so.6

文件指针设置为文件指针数组,如下所示:

FILE **ptr_myfile;
ptr_myfile = malloc( sizeof(FILE *) * (argc-1));
if( ptr_myfile == NULL )
  {
  printf("Error: Not enough memory\n");
  getchar();
  return 1;
  }

i=1;
for( i=1; i<argc; i++)
   {    
   errno=0;
   ptr_myfile[i-1] = fopen(argv[i],"rb");
   printf( "ptr_myfile: i-1 = %d\n", i-1 );
   if (!ptr_myfile[i-1])
    {
    printf( "Unable to open file - is file name correct???   Errno = %d,  %s.\n", errno, strerror(errno) );
    return 1;
    }
  } 
文件**ptr\u myfile;
ptr_myfile=malloc(sizeof(FILE*)*(argc-1));
if(ptr_myfile==NULL)
{
printf(“错误:内存不足\n”);
getchar();
返回1;
}
i=1;

对于(i=1;ii如果你注释掉了你没有粘贴的解析/打印代码,你还会得到一个segfault吗?可能是ptr_myfile[i]在某处被覆盖了..你能试着在打开后和关闭前打印它的十六进制值,看看它是否还是一样的吗?(我对gdb不是很精通..)我在没有读取&prod[I]的部分的情况下尝试了该代码。我没有遇到SEG错误。最有可能的问题是,该块或下一块中的某个地方出现了问题,该块使用所有警告和调试信息解析结构编译的内容(
gcc-Wall-Wextra-g
)。请使用调试器(
gdb
)还有。我建议用
memset
清除每个
malloc
-ed区域,或者使用
calloc
。不要忘了测试
malloc
的结果,没有常量冲突。但是存在缓冲区溢出。您需要为每个字符串的空终止符分配一个额外的字符。每个字符串需要20+1个字符最后一个字符串的folield和argc*20+1。我不确定为什么第一次尝试没有修复它。顺便说一句,sizeof(char)始终为1,您可以在此处保存一些键入内容。如果您注释掉未粘贴的解析/打印代码,是否仍会得到一个segfault?可能是ptr_myfile[I]在某个地方被覆盖..你能试着在打开后和关闭前打印它的十六进制值,看看它是否仍然相同吗?(我自己对gdb不是很精通..)我尝试了没有读入&prod[I]的部分的代码。我没有遇到SEG错误。问题很可能出现在该块或下一个块中的某个位置,该块使用所有警告和调试信息解析结构编译的内容(
gcc-Wall-Wextra-g
)。请使用调试器(
gdb
)还有。我建议用
memset
清除每个
malloc
-ed区域,或者使用
calloc
。不要忘了测试
malloc
的结果,没有常量冲突。但是存在缓冲区溢出。您需要为每个字符串的空终止符分配一个额外的字符。每个字符串需要20+1个字符最后一个字符串的folield和argc*20+1。我不确定为什么第一次尝试没有修复它。顺便说一句,sizeof(char)总是1,您可以在这里保存一些键入。
i=0;
for( i=0; i<argc-1; i++)
  { 
  if (fread(&prod[i], sizeof(struct prod_rec), 1, ptr_myfile[i]) != 1) 
    {
    printf( "error writing sturct:  Errno = %d,  %s.\n", errno, strerror(errno) );
    }
}
i=0;
for( i=0; i<(argc-1); i++)
//for( i=0; i<4; i++)      
  {
  if ( ptr_myfile[i] )
    {       
    fclose( ptr_myfile[i] );
    printf( "fclosed i = %d\n", i ); 
    }
  }
unsigned int field_size=20;
char* print_line = (char*) malloc( (argc)*field_size*sizeof(char) );
char* field      = (char*) malloc( field_size*sizeof(char) );
//heading row corresponding to number of input files
j=1;  
for( j=1; j<(argc); j++) 
  {  
  sprintf( field, "%-20s", argv[j] ); //string to add to first line
  strcat(print_line, field);   //add string to first line
  }