C中奇怪的段错误

时间:2011-09-28 01:13:37

标签: c segmentation-fault

好的,所以我不确定这里发生了什么。我有一个简单的函数int foo(char *filename),它接受​​filename并计算文件中的单词。

int foo(char *filename){

  FILE *inFile;
  int wordCount = 0;    

  printf("foo\n"); // test printf() statement (currently prints)

  char word[50];
  inFile = (&filename, "r");

  printf("infile\n");  // test printf() statement (currently prints)

  while (1){
    printf("while");   // test printf() statement (doesn't print)
    fscanf(inFile, "%s", word);
    if (feof(inFile))
        break;
    printf("%d", wordCount); //test printf() statement
    wordCount++;
  }
  fclose(inFile);
  return wordCount;

}

如你所见,我打印“infile”,但不是“while”。我遇到了分段错误。有没有人知道为什么这不起作用另外,我的inFile = (&filename, "r");声明是否正确?我指点不是那么好。

4 个答案:

答案 0 :(得分:7)

我很惊讶这条线实际编译:

inFile = (&filename, "r");

如果您要尝试打开文件:

inFile = fopen(filename, "r");

编辑:

如上所述,您需要使用printf结束\n或致电fflush(stdout),否则会被缓冲而不能打印。

答案 1 :(得分:4)

你期望这条线做什么?

inFile = (&filename, "r");

因为看起来你错过了一个功能性的电话。我怀疑你想要这样的东西:

inFile = fopen(filename, "r");

也就是说,fopen函数需要一个字符指针,你有这个:

int foo(char *filename){

因此您无需使用&运算符。 &运算符返回变量的地址,因此输入&filename最终会得到(指向(char)的指针)。你很少会使用{{1带字符串的运算符;当函数需要返回多个值时(例如Unix &函数),您通常会看到它被使用。

有很多教程可以更详细地讨论C指针;谷歌搜索“c指针”会产生一些可能的结果。当然,请阅读你的K& R:)。

答案 2 :(得分:3)

您没有看到“while”打印的原因是因为它没有以\n终止,因此在发生seg故障时保留在缓冲区中而不打印出来。

seg错误发生在fscanf,因为你错过了fopen,搞砸了你的指针。 @Mystical解释了如何修复它。

答案 3 :(得分:2)

始终检查来自fopen()的返回值,该呼叫似乎缺失。

FILE *inFile = fopen(filename, "r");
if (inFile == 0)
    ...diagnose error...do not use inFile...

请注意&来电中filename的{​​{1}}缺席;你根本就不需要它。

fopen()之前的printf()不会产生任何结果,因为输出字符串不以换行符结尾;它会一直打印到你打印换行符,然后崩溃就会发生。

发生崩溃是因为字符串fscanf()不是有效的文件流;如果你真的打电话给"r",那可能是因为开放失败而你没有检查它。

如果您的编译器没有给出关于代码的警告,请获得更好的编译器。如果它确实给你警告,请在发布到StackOverflow之前学会注意它们(并修复它们)。


当你遇到它时,你可能想要考虑如果你要阅读的单词是50个字符或更长时间会发生什么。幸福没有随之而来。你应该考虑使用:

fopen()

如果一个单词超过49个字符,它至少现在将被分成若干个49字节单位(每个单位计为一个单词),而不会给你带来缓冲区溢出问题(另一个崩溃源)。如果你需要在循环中进行诊断打印,那就这样吧;添加大括号并打印。

我很少有理由在我(25年以上)的编程生涯中使用while (fscanf("%49s", word) == 1) wordCount++; 。使用它的代码通常是可疑的;我想知道这个人是否学过帕斯卡尔并且在学习C时没有学过它。