因此,对于我的学校课程,我只需要阅读下面格式的文本文件中的整数列表,第一行表示整数的数量。然后对整数进行排序(它们在txt文件中未排序),然后找到平均值。我只是试图将整数读入数组,但是我已经使用了测试.txt文件。
1
3
2
4
...
range("C5").Copy range("B5").End(xlDown).Offset(columnoffset:=1)
这就是我现在要做的,我收到一条错误说segFault(core Dumped)。我是C的新手,所以我真的不确定这意味着什么。
答案 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 space的process之外)。
(我猜你是在Linux或其他一些POSIX系统,但你的问题应该提到这一点)
core dump(在Linux上,详见core(5))是一个文件 - 通常名为core
- 描述错误进程的状态(发生错误时,请参阅{{ 3}}),特别是它的虚拟地址空间。您可以signal(7) gdb
调试器来调试事后核心转储。您也可以禁用核心转储(但最好不要,它们非常有用),例如使用ulimit -c
bash内置(或use系统调用)。
然而,并非所有未定义的行为都会产生这样的错误。你很幸运得到一个。并且它可能发生(例如因为setrlimit(2))另一次运行相同的错误ASLR不会导致核心转储或段错误(但会有更糟糕的行为)。
在实践中:
使用executable编译所有警告和调试信息:gcc -Wall -Wextra -g
。改进您的代码以完全不发出任何警告(在您的情况下,您的代码会收到一些警告)。
阅读文档,特别是您正在使用的GCC和compiler函数(例如,您错误地使用every:永远不会给1)。之后,您甚至可以阅读C11标准fgets
。
了解如何 n1570 了解错误程序的行为。这是获得的基本技能。你应该有use the gdb
debugger。
也许你想使用valgrind。见getline(3)。也许你可以拥有this,例如flexible array member和here,但有一些reason。
还要注意abstract data type及其Halting Problem。
PS。所有开发人员都会犯错误。找到它们很有挑战性,也很有趣。但编程是undecidability。