你如何找到并修复段错误?

时间:2014-03-03 14:54:28

标签: c segmentation-fault fgets

我一直在寻找互联网和SO,并试图找到如何检测和修复段错误。我倾向于经常收到这个错误,而且我在google上找到的所有内容都是内存问题(这个答案有很多帮助:https://stackoverflow.com/a/3200536/3334282)。我想知道导致它的糟糕编程是什么,以便我可以避免它。

我最近的例子是试图学习如何使用fgets()。

FILE *text;
char array[100];

fopen("text.txt", "r");
fgets(array, 100, text);

printf("%s\n", array);

fclose(text);

这将返回8181分段错误(核心转储)。

3 个答案:

答案 0 :(得分:5)

在这种情况下,非常明显:你在哪里初始化text

未初始化的局部变量具有不确定的值,使用未初始化的局部变量会导致未定义的行为 会导致崩溃。


对于问题标题中提到的更通用的问题,这更难,因为相当多的事情可能导致分段错误。使用未初始化的指针可能导致它,使用NULL指针肯定会导致崩溃。在分配内存的边界之外写入(比如写出数组的边界),可以覆盖其他数据,使得其他指针意外地改变它们的值,并且也可能导致崩溃。

简而言之,如果使用不当,使用指针会导致分段错误。

但是,许多未定义行为的情况(例如代码中的行为)可以通过启用更多警告(例如GCC的-Wall标志)并修复这些警告来避免。虽然警告在技术上不是错误,但它们通常表明你做了可疑的事情。再次以您的代码为例,通过将-Wall添加到您的GCC命令行,您将收到有关使用未初始化变量text的警告。

答案 1 :(得分:1)

当您尝试使用未由操作系统分配给您的进程的内存时,会出现

Segmentation fault。一些常见的情况是当你使用指针时。

当您尝试释放未分配给您的内存(当指针具有垃圾值时),例如您的案例text未初始化且您尝试关闭它。

当您尝试释放已释放的内存时。

答案 2 :(得分:1)

即使您显示了使用动态分配的语言(如Perl或Python)的源代码,也没有为变量text分配值。因此,大多数语言都存在同样的问题。防止这样的问题的方法是检查变量。

您可以使用printf或使用调试器打印它们。在您的情况下,printf - text会显示一个对您没有意义的数值,并且当您执行打开时,您将获得段错误。

您正在获得段错误,因为您的程序正在尝试访问特权内存;至少它对您运行程序的进程有特权。如果您已将text分配给fopen对帐单

的返回值

text = fopen("text.txt", "r");

然后文本将为NULL或包含text.txt的文件句柄。这是因为你只是使用text's随机值来获得段错误。