所以我相信这只是 unix 上的一个问题,如果 Clion 调试器是正确的,它会在第一个 fscanf 时发生,但我不知道为什么会收到错误 - Process finish with exit code 139(被信号 11 中断: SIGSEGV)-为什么?
struct loginInformation
{
char username[USERNAME_LENGTH];
char password[PASSWORD_LENGTH];
int type;
}accounts[NUM_OF_ACCOUNTS];
void createAccountsFromFile()
{
FILE *input = fopen("accounts.txt", "r");
int counter;
for(counter = 0; counter < NUM_OF_ACCOUNTS; counter++)
{
fscanf(input, "%s", accounts[counter].username);
fscanf(input, "%s", accounts[counter].password);
fscanf(input, "%d", &accounts[counter].type);
}
}
int main()
{
createAccountsFromFile();
}
accounts.txt
user1
pass1
0
user2
pass2
1
user3
pass3
2
user4
pass4
3
这意味着程序在退出之前就崩溃了。你需要调试程序。例如,您需要在
fopen
之后检查文件是否成功打开。
TL;DR:您的程序试图访问它无权访问的内存位置,因此操作系统杀死了它。
第一:代码“139”并不重要,忘记数字吧。您的程序在“收到 SIGSEGV”或有关分段违规的信号后终止。在这里阅读这意味着什么:
(别介意这个问题是关于 C++ 的,同样的想法。)
现在,为什么会发生这种情况?你一定做出了一些不应该做的假设。查看您的代码,可能是:
loginInformation
数组的边界 - 甚至可能超出了分配给整个程序的内存区域的边界。fscanf()
调用生成的一些错误(如果扫描失败,您需要检查 errno
)。我认为这涵盖了它,尽管也许我错过了一些东西。您可以使用调试器在 core dump:
上实际检查发生了什么,而不是猜测SIGSEGV 并不总是由于内存访问问题的根本原因而抛出...
Perl 在 Unix 上抛出 139 通常是因为文件 I/O。您可能不小心删除了输入文件。
检查下面链接的讨论bin/控制台错误139
关于我的“内存不足”导致的 Perl 编程 RC 139。 因为变量中的数据太多了(数百万)。 我通过定期释放(undef)这个变量来手动进行分段。 这解决了这个问题。