所以我认为这只是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
答案 0 :(得分:2)
这意味着程序在退出之前崩溃了。您需要调试该程序。例如,您需要检查文件是否在fopen
之后成功打开。
答案 1 :(得分:0)
SIGSEV并不总是导致内存访问问题的根本原因......
Perl通常因为文件I / O而在Unix上抛出139。您可能不小心删除了输入文件。
答案 2 :(得分:-1)
TL; DR:您的程序尝试对没有权限的地方进行内存访问,因此操作系统将其杀死。
第一:代码“139”无关紧要,忘了数字。您的程序在“获取SIGSEGV”或关于分段违规的信号后终止。请阅读这里的含义:
What is SIGSEGV run time error in C++?
(不要紧,这个问题是关于C ++的,同样的想法。)
现在,为什么会发生这种情况?你必须做出一些你不应该做的假设。查看您的代码,可能是:
loginInformation
数组范围的非常长的字符串 - 甚至可能是分配给整个程序的内存区域的边界。fscanf()
调用产生的错误(如果扫描失败,您需要检查errno
。)我认为这涵盖了它,虽然我可能错过了一些东西。而不是推测您可以使用core dump上的调试器实际检查发生了什么: