所以我相信这只是Unix上的一个问题,如果Clion调试器是正确的,那么它会在第一个fscanf出现,但是我不知道为什么我得到了错误--进程以退出代码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
4条答案
按热度按时间tuwxkamq1#
这意味着程序在退出之前崩溃了。您需要对程序进行调试。例如,需要在
fopen
之后检查文件是否打开成功。wlp8pajw2#
SIGSEGV并不总是由于内存访问问题的根本原因而引发...
Perl在Unix上抛出139,通常是因为文件I/O。您可能不小心删除了输入文件。
igetnqfo3#
TL;DR:您的程序试图访问它无权访问的内存位置,所以操作系统终止了它。
第一:代码“139”无关紧要,忘了数字吧。您的程序在“收到SIGSEGV”或有关分段违规的信号后被终止。在这里阅读这意味着什么:
What causes a SIGSEGV
(不要管这个问题是关于C++的,同样的想法。)
那么,为什么会发生这种情况呢?你一定是在做一些你不该做的假设。查看您的代码,它可能是:
loginInformation
数组的界限--甚至可能超过了分配给程序的整个内存区域的界限。fscanf()
调用产生的错误(如果扫描失败,则需要检查errno
)。我想这就够了,尽管我可能遗漏了一些东西。您可以在core dump上使用调试器实际检查发生了什么,而不是猜测:
How do I analyze a program's core dump file with GDB when it has command-line parameters?
pokxtpni4#
关于Perl编程RC139因“内存不足”而引起的问题。因为一个变量中有太多的数据(百万)。我已经通过定期发布(Undef)这个变量进行了分割。这解决了这个问题。