C程序在fclose期间接收到信号SIGSEGV
我是一个来自遥远过去的锈迹斑斑的C程序员。具有打开二进制文件的代码(包含有关产品的详细信息,例如id、价格等)。文件名是调用.out程序(当前在Ubuntu 12.04 w/gcc上运行)时的输入参数。编译没有错误的文件。运行时,打开文件,将数据放入结构(与二进制文件中的数据字段相匹配),以简单的列方式打印所有数据字段(没有花哨的格式,只有一列内容,每个列对应于命令行中包含的每个文件)。然后通过fclose关闭文件指针。在测试中,一切正常,直到FCF失败。最后一个fclose(最后一个文件指针关闭)导致分段错误。当第四个文件指针尝试fclose时,运行gdb(例如有4个输入文件)会输出以下内容: 程序接收信号SIGSEGV,分段故障。 0xb7e95ac6英寸??()来自/lib/i386 linux gnu/libc.so.6 文件指针设置为文件指针数组,如下所示:C程序在fclose期间接收到信号SIGSEGV,c,fclose,C,Fclose,我是一个来自遥远过去的锈迹斑斑的C程序员。具有打开二进制文件的代码(包含有关产品的详细信息,例如id、价格等)。文件名是调用.out程序(当前在Ubuntu 12.04 w/gcc上运行)时的输入参数。编译没有错误的文件。运行时,打开文件,将数据放入结构(与二进制文件中的数据字段相匹配),以简单的列方式打印所有数据字段(没有花哨的格式,只有一列内容,每个列对应于命令行中包含的每个文件)。然后通过fclose关闭文件指针。在测试中,一切正常,直到FCF失败。最后一个fclose(最后一个文件指针关
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
}