【问题标题】:Array Segmentation Fault数组分段错误
【发布时间】:2012-11-24 11:03:04
【问题描述】:

我遇到了分段错误的问题。 看:

#include<fstream>
using namespace std;
int main(){
    int n,i,vector[10001],vectorcopy[10001];
    ifstream in("program.in");
    ofstream out("program.out");
    in>>n;
    for(i=1;i<=n;i++){
        in>>vector[i];
        vectorcopy[i]=vector[i];
    }
    return 0;}

调试器说: 程序接收到信号 SIGSEGV,分段错误

请告诉我该怎么做!

【问题讨论】:

  • 您需要检查您的输入文件是否真正打开成功 - 即添加错误检查。
  • 在调试器中运行它,它会告诉你调用堆栈的位置以及它在哪一行被分割
  • 您的程序从不检查任何操作是否成功。它可能会在任意数量的点上失败。
  • 您的 for 循环必须是 for(i = 0 ; i &lt; n; ++i)。数组在 C 和 C++ 中索引为零
  • 避免将变量命名为 stl 类(向量、字符串等)。特别是因为你写了using namespace std;。顺便说一句,也避免这种情况

标签: c++ arrays segmentation-fault fstream


【解决方案1】:

如果输入文件program.in 正确,您的程序(大部分)工作正常。我想您的分段错误错误是由以下原因引起的:

  • 输入错误
  • 您的程序中缺少输入检查

这个program.in 输入文件没有错误:

10
1
2
3
4
5
6
7
8
9
10

其他错误

我说“大部分”是因为您的程序中还有一些其他错误。他们现在并没有造成麻烦(C++ 称之为“未定义的行为”),但迟早他们会:

  • 对于大小为n 的数组,索引从0 开始,到n - 1 结束;使用数组时,不要像这样编写for 语句:

    for (i = 1; i <= n; i++)
    

改写为:

    for (i = 0; i < n; i++)
  • 您没有使用vectorcopy 数组
  • 您没有向program.out 输出文件写入任何内容

【讨论】:

  • 他在for循环中使用vectorcopy数组
  • 只要他不读过去vector[10000],也不写过去vectorcopy[10000],他的代码就可以正常运行。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2021-06-27
  • 2017-04-11
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多