我在这段代码中看到错误。在fscanf中,需要引用缓冲区的地址(& buffer)。有人可以解释错误"分段错误"?我是新手用gcc编译的东西,我不明白它试图告诉我什么。
int buffer;
char junk;
while(fscanf(fp,"%d%c",buffer, &junk) !=EOF)
{
printf("%d\n",buffer);
}
fclose(fp);
return 0;
}
答案 0 :(得分:17)
我注意到没有一个答案实际上解决了你的问题:
有人可以解释错误“分段错误”吗?
在C中编写具有“未定义行为”的程序非常容易。你这样做了。具有未定义行为的程序可以逐字地执行任何。它可以进入无限循环。它可以给出分段错误。它可以正常工作。将文件通过电子邮件发送到朝鲜后,它可以清除您的硬盘。它可以任何。
未定义行为的一个非常常见的症状是分段错误。基本上这意味着你编写了一个程序未定义的行为,你很幸运。您的程序尝试访问它无权访问的内存。而不是删除您的硬盘,操作系统会给您一个分段错误。每次遇到分段错误都应该感谢;它可能会变得更糟,更糟糕。 seg故障会引起对错误的注意,以便您可以轻松修复它。
具体来说,这里发生的是:
buffer
未初始化为任何值。它的值可以是任何合法的整数。 fscanf
需要一个指针。指针具有以下属性:当取消引用时,它们变成变量。指针通常实现作为整数,将地址存储到变量的内存位置。 (请注意,指针不是必需这样实现,但它是一种常见的选择。)buffer
碰巧有一个值,当被解释为指针时,恰好引用一个未使用的页面,那么当fscanf
试图转向时,操作系统将产生一个seg错误指针指向存储位置。现在想想在其他情况下会发生什么。 buffer
可能碰巧包含一个整数,当它被解释为指针时会生成一个有效的内存地址,并且该有效内存地址可能恰好包含当前方法的返回地址。由fscanf
放入该位置的值可能恰好是“格式化硬盘”库例程的地址。在这种情况下,你不会得到分段错误;相反,当当前方法返回时,它将格式化您的硬盘而不是终止程序。同样,请确保您理解这一点:未定义的行为可以完全做任何事情。
大多数情况下,您会很幸运,并且会出现分段错误。不要依赖这个安全网!不要首先编写未定义的行为。
作为历史记录,术语“分段错误”来自操作系统将内存“分段”为代码,数据等部分的常见做法。操作系统当然没有要求这样做,但大多数现代操作系统使用某种形式的分段来帮助捕获这些错误。
答案 1 :(得分:6)
你很亲密..
fscanf(fp,"%d%c",&buffer, &junk)
答案 2 :(得分:2)
&
buffer
之前您错过了fscanf
运营商。
答案 3 :(得分:0)
当它是地址问题时,你有两种可能性;定义一个指针:在这种情况下为int * buffer,对于那种情况,缓冲区就可以了。 但是,如果您使用常规变量,则必须通过添加运算符'&'来提供其地址。 其次,我看到你使用了名为“fp”的变量。我在代码中找不到该变量的定义。