c语言打开文件出现分段故障,C文件I / O中的分段故障11(Segmentation Fault 11 in C File I/O)...

C文件I / O中的分段故障11(Segmentation Fault 11 in C File I/O)

我正在编写一个函数来搜索格式如下的文本文件:

#用户1 \路径\

#用户2 \路径\

#用户3 \路径\

我写了函数Check_User:

int Check_User(char input[20], FILE *userlist)

{

int c, i;

fseek(userlist, 0, SEEK_SET);

while(1)

{

while((c = fgetc(userlist)) != '#')

{

if(c == EOF)

return 1;

}

while(input[i] == (c = fgetc(userlist)))

{

i++;

}

i = 0;

if(c == '\\')

return 0;

}

}

这是从这里打来的:

while(Check_User(username, userlist) == 0)

{

printf("Username already in use. Please select another:");

Get_Input(username);

}

检查用户检查* userlist指向的文件,以查看用户名[20]是否包含已在使用的用户名。 如果它已在使用中,则调用Get_Input以获取新用户名。

该程序一直到while循环,然后给我一个分段错误:11。我已经读过这通常源于尝试写入数组的末尾,或者通常做的事情是你没有的内存进入。 Userlist.txt已在r +模式下打开。

谢谢您的帮助。

I'm writing a function which searches a text file formatted like this:

#User1\pass\

#User2\pass\

#User3\pass\

I have written the function Check_User:

int Check_User(char input[20], FILE *userlist)

{

int c, i;

fseek(userlist, 0, SEEK_SET);

while(1)

{

while((c = fgetc(userlist)) != '#')

{

if(c == EOF)

return 1;

}

while(input[i] == (c = fgetc(userlist)))

{

i++;

}

i = 0;

if(c == '\\')

return 0;

}

}

Which is called from here:

while(Check_User(username, userlist) == 0)

{

printf("Username already in use. Please select another:");

Get_Input(username);

}

Check user checks the file pointed to by *userlist to see if the username[20] contains a username which is already in use. If it is already in use it calls Get_Input for a new username.

The program makes it all the way to the while loop and then gives me a segmentation fault: 11. I have read that this often stems from trying to write beyond the end of an array, or generally doing things to memory you don't have access to. Userlist.txt has been opened in r+ mode.

Thanks for the help.

原文:https://stackoverflow.com/questions/24985178

更新时间:2019-11-12 06:11

最满意答案

在第一次使用之前,您没有初始化变量i 。 在C中,声明的变量不会初始化为数字0(因为它们将在C#或Java中),而只是使用之前存在于其内存位置的值。 因此, i的值可能远大于字符串input的长度,并且input[i]可能访问无效的存储器位置。

作为旁注:要在Linux下valgrind --tool=memcheck 快速调试,使用调试符号( gcc -g )编译程序,然后使用valgrind --tool=memcheck 让valgrind为您找到错误的来源。

You did not initialize your variable i before its first use. In C, declared variables are not initialized to numerical 0 (as they would be in C# or Java), but simply use the value that was present at their memory location before. Thus, the value of i may be far bigger that the length of the string input, and input[i] may access an invalid memory location.

As a side note: to quickly debug this yourself under Linux, compile the program with debug symbols (gcc -g) and then use valgrind --tool=memcheck to let valgrind find the source of error for you.

2014-07-27

相关问答

使用square = "" ,您将变量square的值更改为指向空字符串。 由于此变量在函数convert是局部变量,因此更改它在函数外部没有任何影响。 如果要将指向数据设置为空字符串,请改用square[0] = '\0' 。 顺便说一句,即使它确实在函数之外产生了影响(例如,如果你使用全局变量而不是局部变量),那么它不仅不能解决问题,而且还会使事情变得更糟: 此变量将指向一个字符串,该字符串在具有只读访问权限的内存段中分配。 此变量将指向一个字符数组,在内存中分配给单个字符的大小。 由于这些事

...

您没有分配从初始分配bounds获得的每个后续double* 。 在这里你可以为3 double*类型创建空间: bounds = (double **) malloc(3 *sizeof(double *));

但是当你为每个后续的double*指针生成空间时,你只能从0循环到1: int i;

for (i = 0; i < 2; i++){

bounds[i] = (double *) malloc(2 *sizeof(double));

}

因此, *(*(bounds + 2

...

fprintf(fPointer, "%s\n", line)

这就是问题。 您正在通过fgets获取一行到您的数组,而不是将其打印到标准输出,您尝试打印到您以只读方式打开的文件。 您只需要为该作业使用普通printf 。 编辑 原来这不是它为什么会出现段错误的原因,但是如果你想让你的程序做你想做的事情,它仍然是一个问题。 检查文件是否真的存在,这可能是@MikeCAT指出的问题。 fprintf(fPointer, "%s\n", line)

This is the problem. You

...

你的for循环没有结束。 您不检查fgets的结果,当您到达文件末尾时,它会给出NULL 。 你也不检查fopen的结果,当无法打开文件时,它会给出NULL 。 在使用argv[1]之前,你不检查argc是否至少为2 你使用open而不是fopen 提示:如果您使用的是GCC,请使用-Wall -pedantic 。 Your for loop doesn't end. You don't check the result from fgets, which gives NULL when you

...

只是一个想法,在这里: for(i=0; i<2; i++) {

palavra(n, &m, &tam, c, pal);// here

if(compare_dicionario(tam, pal) == 1) {

achou++;

}

}

为什么在函数参数中使用一个地址,稍后在分配给迭代器时,你的函数需要一个指针给她。 for(i=*m;..

在这里阅读更多内容 Just an idea, here: for(i=0; i<2; i++) {

...

解决了它。 问题是两件事:1)转换为Double 2)处理一个空数组 转换为双倍 从var lat: Double? = d["lat"].doubleValue改变var lat: Double? = d["lat"].doubleValue var lat: Double? = d["lat"].doubleValue到var lat: Double? = Double(d["lat"].doubleValue) var lat: Double? = Double(d["lat"].doubl

...

你在for循环中增加i而不是j You increment i instead of j inside the for loop

在第一次使用之前,您没有初始化变量i 。 在C中,声明的变量不会初始化为数字0(因为它们将在C#或Java中),而只是使用之前存在于其内存位置的值。 因此, i的值可能远大于字符串input的长度,并且input[i]可能访问无效的存储器位置。 作为旁注:要在Linux下valgrind --tool=memcheck 快速调试,使用调试符号( gcc -g )编译程序,然后使用valgrind --tool=memcheck 让valgri

...

当地的声明 int *array;

阴影成员array 。 所以下面的代码使用局部变量,而不是成员。 因此该成员未初始化。 而不是创建自己的动态数组,使用std::vector 。 这更安全,更方便。 在其他新闻中: get_size的get前缀是Java-ism。 在C ++中, get前缀没有优势,它使代码的可读性降低。 例如,标准库容器具有size方法,而不是get_size 。 使用void作为形式参数声明,就像在get_size(void) ,是一个C-ism。 在C中,它具有

...

不要这样做: for (j = 2; j <= argc; j++)

{

if (strcmp(argv[j], "row") == 0)

C具有基于0的数组。 相反: for (j = 2; j < argc; j++)

如果argc说有2个项目,则表示插槽[0]和[1] 几乎总是for循环应该从0到N - 1 或者,您可以在没有argc的情况下进行迭代,因为数组的最后一个插槽是NULL。 while(argv[i] !

...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值