为什么我会收到“Segmentation fault(core dumped)”

时间:2015-09-27 13:34:01

标签: c

我是C编程的新手,我正在尝试用linux编写程序。

#include <stdio.h>
#include <stdlib.h>



 char num, fileName[260];
   int numCount, inp;
   FILE *fp, *nf;


int main(int argc, char *argv[]){




   printf( "1. New file\n" );
   printf( "2. Display file\n" );
   printf( "3. Edit file\n" );
   printf( "4. Exit\n" );
   scanf( "%d", &inp );



   switch (inp){
    case 1:            
        displayFile();
       break;
    case 2:            
        printf("\n");
        break;
    case 3:            
        printf("\n");
        break;
    case 4:            
        printf("\n");
        break;
    default:            
        printf("\n");
        break;
   }




   fclose(fp);
   return 0;
}



int displayFile(void){

    printf("Enter the name of file. \n");
    scanf("%s",fileName);
    fp = fopen(fileName,"r");


    if(!fp){

        printf("Error! Cannot open file \n");
        exit(1);
   }

    else{
        printf("The content of %s are :\n", fileName);

        while( ( num = fgetc(fp) ) != EOF ) //End-of-file
            numCount++;
            printf("%c",num);

    }
        printf("There are %i numbers in file:\n", numCount);

}

这是我运行程序时会发生的事情: 它启动,给我选择案例,我选择“显示文件”,它给我“输入文件名”。但是,在出现“core dumped”错误消息之前,我无法选择编写。

2 个答案:

答案 0 :(得分:2)

当您选择2. Display file时,未分配fp且其值为NULL,因为它是未显式初始化的全局变量。

fclose似乎在NULL通过时粉碎。

例如,

#include <stdio.h>

FILE *fp;


int main(void){
   fclose(fp);
   return 0;
}

Wandbox上发出了分段错误。

我认为您应该关闭不在main功能但在displayFile功能中的文件。

此外,您不应该有太多的全局变量:您应该将其中一些变为本地变量。

答案 1 :(得分:0)

您的程序在方法中是非常错误的,您不需要在程序中声明单个全局变量。

问题包括:

  1. 您没有为displayFile()提供可能导致未定义行为的声明( prototype ),如果您启用了编译器警告,编译器会警告隐式函数声明

  2. 使用全局变量会使代码变得混乱且可能出错。

  3. 您在一个函数中打开文件,并在另一个函数中关闭它,并且在调用NULL之前您不会检查fclose()并将NULL传递给{ {1}}是未定义的行为,它似乎是实际问题。

    在一个功能中打开文件并在antoher中关闭它在概念上是错误的。由于第2点,它在您的程序中成为可能。

    全局变量很危险,因为很难跟踪它们的状态,你可以在一个函数中修改它,并在另一个函数中使用它时错过它。而且,很少需要全局变量。

  4. 您永远不会检查fclose()的返回值,在第一个scanf()中它非常危险,因为在阅读scanf()时会导致未定义的行为。

  5. inp