尝试从.txt文件复制整数时出现分段错误

时间:2018-04-06 06:45:07

标签: c file dynamic-arrays

因此,对于我的学校课程,我只需要阅读下面格式的文本文件中的整数列表,第一行表示整数的数量。然后对整数进行排序(它们在txt文件中未排序),然后找到平均值。我只是试图将整数读入数组,但是我已经使用了测试.txt文件。

9

1

3

2

4

...

range("C5").Copy range("B5").End(xlDown).Offset(columnoffset:=1)

这就是我现在要做的,我收到一条错误说segFault(core Dumped)。我是C的新手,所以我真的不确定这意味着什么。

2 个答案:

答案 0 :(得分:1)

我没有检查过你的整个代码,但这会导致分段错误:

//determine the number of values
char *lineOne;

if(fgets(lineOne, 80, fp)!=1)
    puts (lineOne);

你需要有lineOne的记忆。只有一个指针并不意味着你的缓冲区有内存,你需要在堆或堆栈上分配它。试试这样:

char lineOne[81]; // allocation on stack

char *lineOne = malloc(sizeof(*lineone) * 81); // allocate on heap

答案 1 :(得分:1)

  

我收到错误说:分段错误(核心转储)

segmentation fault几乎是 undefined behavior (UB),意味着您的程序是buggy,因为计算机正在取消引用某些无效memory address (在virtual address spaceprocess之外)。

(我猜你是在Linux或其他一些POSIX系统,但你的问题应该提到这一点)

core dump(在Linux上,详见core(5))是一个文件 - 通常名为core - 描述错误进程的状态(发生错误时,请参阅{{ 3}}),特别是它的虚拟地址空间。您可以signal(7) gdb调试器来调试事后核心转储。您也可以禁用核心转储(但最好不要,它们非常有用),例如使用ulimit -c bash内置(或use系统调用)。

然而,并非所有未定义的行为都会产生这样的错误。你很幸运得到一个。并且它可能发生(例如因为setrlimit(2))另一次运行相同的错误ASLR不会导致核心转储或段错误(但会有更糟糕的行为)。

在实践中:

  • 使用executable编译所有警告和调试信息gcc -Wall -Wextra -g。改进您的代码以完全不发出任何警告(在您的情况下,您的代码会收到一些警告)。

  • 阅读文档,特别是您正在使用的GCCcompiler函数(例如,您错误地使用every:永远不会给1)。之后,您甚至可以阅读C11标准fgets

  • 了解如何 n1570 了解错误程序的行为。这是获得的基本技能。你应该有use the gdb debugger

  • 了解更多关于UB,并且非常tests。最糟糕的UB是显然不会(总是)出错的。像scared这样的工具很有帮助。

也许你想使用valgrind。见getline(3)。也许你可以拥有this,例如flexible array memberhere,但有一些reason

还要注意abstract data type及其Halting Problem

PS。所有开发人员都会犯错误。找到它们很有挑战性,也很有趣。但编程是undecidability