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

0 c fgets segmentation-fault

我一直在寻找互联网和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);
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ude 5

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

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


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

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

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