【问题标题】:segmentation fault(core dumped) in C in ubuntuubuntu中C中的分段错误(核心转储)
【发布时间】:2017-10-06 17:47:04
【问题描述】:

这是 main.c

这是 print.c

#include <stdio.h>
int wc(FILE *pointer)
{ 
  int a;
  int character=0,word=0,line=0;
  a = getc(pointer);
  while ( a != EOF )
  { 
    character++;
    if (a == ' ')
      word++;
    if (a == '\n')
       line++;
    a = getc(pointer);
  }

  printf("character: %4d, word: %4d, line: %4d \n", character,word,line);
  return 0;
}

这是word.c

gcc -c print.c
gcc -c word.c
gcc -c main.c
gcc -o main main.o print.o word.o
./main
text.txt
text.txt
segmentation fault (core dumped)

这是我使用的编译方式。

但我不知道为什么我有分段错误(核心转储)。

请帮帮我。

【问题讨论】:

  • 编译所有警告和调试信息:gcc -Wall -Wextra -g。然后使用调试器gdb;你的修复我的代码问题是题外话。阅读您正在使用的每个标准功能:fopen(3) - 以及许多其他功能 - 可能会失败。测试不喜欢here
  • 发布文字而不是图片会更好。
  • 一方面,您打开文件两次,中间没有关闭它。

标签: c ubuntu segmentation-fault fault


【解决方案1】:

main()中,您应该通过查看返回值是否为NULL来检查fopen()是否成功,在这种情况下发生错误。

此外,即使条件argc&gt;1 不满足main() 中的第二个fopen(),您也在使用argv[1]。如果argc 小于2argv[1] 将不存在。

printfile()while 循环中,break 语句将在第一次迭代时执行。

因此,将 while 变为 if 语句并删除 break 将具有相同的效果。

wc()while循环中,

if (a == ' ')
  word++;
if (a == '\n')
   line++;

可以制作

if (a == ' ')
  word++;
else if (a == '\n')
   line++;

如果a(空格),则无需检查a 是否为\n

编辑:并且不要忘记在使用完毕后关闭所有打开的文件。

【讨论】:

  • 我的英语和C编程还很差。我理解你的评论很多事情,但是关于 fclose(),我只理解一件事......如果你没事,你能教我在我的代码中应该在哪里使用 fclose()......?
  • @Huitseize 一旦你使用完一个文件。如果您仍然需要该文件但需要打开另一个文件,请使用 不同的 文件指针来打开它。
  • @Huitseize 如果您删除main() 中的第二个fopen(),您对fclose() 的使用似乎是合适的。
猜你喜欢
  • 2021-07-19
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多