分段错误(核心转储)

时间:2012-09-19 17:05:44

标签: c segmentation-fault

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

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

    /*
    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;
    }

2 个答案:

答案 0 :(得分:4)

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

我怀疑您的问题是输出文件fw无法打开,因此对fputs(buffer, NULL)的调用正在崩溃。您应该检查以确保文件已成功打开,如果不成功,则相应地进行纾困。由于您传递了"W+"的无效模式字符串,因此可能无法打开。

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

答案 1 :(得分:3)

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

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

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

GDB

修复方法是使用以下行打开文件:

fclose(fw);

请注意,w现在是小写。

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