我一直在寻找互联网和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分段错误(核心转储)。
答案 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
随机值来获得段错误。