C - 分段错误(核心转储)



我在读取和写入文件时遇到问题。我正在从input.txt读取数据,计算(字节问题)并将结果写入文件。

如果我删除代码的最后一部分,

    /*
    for ( input_counter=0; input_counter<no_of_cases; input_counter++)
    {
        sprintf(buffer, "%d", max[input_counter]);
    fputs(buffer, fw);                
    }   
    fclose(fw);
    */

一切正常(除了我无法写入文件)。但是我能够编译和运行代码。

但是,在包含该代码时,我收到错误"分段错误(核心转储)"。知道会发生什么吗?

    #include<stdio.h>  
    #include <stdlib.h>  
    int Calculate_max (int number){
        int counter;
        int store[number+1];
        store[0] = 0;
        if (number>=1){
            store[1] = 1;
        }
        if (number>=2){
            store[2] = 2;
        }
        for (counter=3; counter<=number; counter++){
            store[counter] = store [counter/2] +store[counter/3]+store[counter/4];
            if (store[counter]<counter){
               store[counter]=counter;
            } 
        }
        return store[number];
    }
    int main(void){
        int no_of_cases=0;
        int number[10];
        int max[10];
        int input_counter=0;
        char line [ 128 ];
        char buffer [ 16 ];
        FILE *fr= fopen ("input.txt", "rt");            /* declare the file pointer */
        FILE *fw= fopen ("output.txt", "W+");           /* declare the file pointer */
        if ( fr != NULL )
        {
            if ( fgets ( line, sizeof line, fr ) != NULL ) /* read a line */
        {   
            no_of_cases = atoi (line);
            //printf("no %d n", no_of_cases);
        }       
        if (no_of_cases==0)
        {
            printf("No Cases!!");
        }
        else 
        {
            for ( input_counter=0; input_counter<no_of_cases; input_counter++)
            {
                if ( fgets ( line, sizeof line, fr ) != NULL ) 
            {
                number[input_counter] = atoi (line);
                //scanf (line, number[input_counter], "%d");
                //printf(" %s n " , line);
                //fputs ( line, stdout ); 
            }              
            max[input_counter]= Calculate_max(number[input_counter]);
            //fwrite(max[input_counter],sizeof(int),1,fp);          
            //fprintf(fw, "%d n", max[input_counter]);                
            printf("%d n", max[input_counter]);                
           }            
            }
        fclose(fr); 
        }   
        /*
        for ( input_counter=0; input_counter<no_of_cases; input_counter++)
        {
            sprintf(buffer, "%d", max[input_counter]);
        fputs(buffer, fw);                
        }   
        fclose(fw);
        */
    return 0;
    }

新代码:

    #include<stdio.h>  
    #include <cstdlib>  
    long long Calculate_max ( long long number)
    {
    long long counter;
    long long store[number+1];
    store[0] = 0;
    if (number>=1){
        store[1] = 1;
    }
    if (number>=2){
        store[2] = 2;
    }
    for (counter=3; counter<=number; counter++){
        store[counter] = store [counter/2] +store[counter/3]+store[counter/4];
        if (store[counter]<counter){
            store[counter]=counter;
        }
    }
    return store[number];
    }         
    int main(void)
    {
    int no_of_cases=10;
    long long number;
    long long max[10];
int input_counter=0;
char line [128];
char buffer [ 64 ];
FILE *fr= fopen ("input.txt", "rt");            /* declare the file pointer */
FILE *fw= fopen ("output.txt", "w+");           /* declare the file pointer */
if ( fr != NULL )
{   
    while ( fgets ( line, sizeof line, fr ) != NULL ) 
        {
            //number= atoll (line);
            number=1000000000;              
            max[input_counter]= Calculate_max(number);
            input_counter++;
            printf("test n");
        }              
    fclose(fr);
}   
printf("writing n");
no_of_cases=input_counter;
for ( input_counter=0; input_counter<no_of_cases; input_counter++)
{
    sprintf(buffer, "%lld", max[input_counter]);        
    fputs(buffer, fw);                
    fputs("n", fw);                
}   
fclose(fw); 
return 0;
    }

你真的应该在这里使用调试器,它会准确地告诉你哪一行代码崩溃了。

我怀疑您的问题是输出文件fw无法打开,因此对fputs(buffer, NULL)的调用崩溃。 您应该检查以确保文件已成功打开,如果没有,请相应地进行救助。 它可能无法打开,因为您传递的模式字符串无效 "W+"

只尝试"w"(小写w,而不是大写),因为您只需要写入访问权限,因此不需要读写访问权限(如果这样做,请改用"w+")。

编辑:您的新代码在Calculate_max()函数中store[0] = 0失败,因为您的number包含的值太大,无法在堆栈上创建该大小的long longs数组。

正如 Adam 在他的回答中所建议的那样,您应该使用调试器来帮助您确定代码导致问题的位置。我已经为你完成了这个,所以你可以看到它是如何完成的。希望你会发现这很有用。

这是使用 GDB 的调试会话。您将看到分段错误是由第 69 行引起的:

fclose(fw);

解决方法是使用以下行打开文件:

FILE *fw= fopen ("output.txt", "w+");

请注意,w 现在是小写的。

[jrn@localhost ~]$ gcc -ggdb boom.c -o boom
[jrn@localhost ~]$ gdb boom
Reading symbols from /home/jrn/boom...done.
(gdb) run
Starting program: /home/jrn/boom 
Program received signal SIGSEGV, Segmentation fault.
0x00c0660d in fclose@@GLIBC_2.1 () from /lib/libc.so.6
(gdb) bt
#0  0x00c0660d in fclose@@GLIBC_2.1 () from /lib/libc.so.6
#1  0x08048759 in main () at boom.c:69

相关内容

  • 没有找到相关文章

最新更新