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