【问题标题】:c++, reading files, segmentation faultc++,读取文件,分段错误
【发布时间】:2012-08-06 02:05:32
【问题描述】:

我正在研究这个函数读取。我使用的main 文件I/O 没有问题,连接正常,关闭,文件也正常。但是,在阅读结束时我遇到了分段错误。我已经尝试打印出来进行测试,错误是读取最后一行。它完成了字符串a 的最后一行的读取,然后是x,然后in.good() 也变为false。我尝试过重置in.clear(),如果in.good 变为假,则设置字符串a="";。没有任何效果。

read(istream& in){
    string a;
    int x;
    in>>a;
    while( in.good() ){
        in>>x;
        char *ch;
        strcpy( ch, a.c_str() );
        Word cwd(ch);
        anObject.add(cwd,x);   
    }
}

【问题讨论】:

  • 设置了哪个位? badbit, eofbit or failbit?这可能会让您很好地了解接下来需要查看的内容。

标签: c++ c file io segmentation-fault


【解决方案1】:

您看到一个段错误,因为您没有为ch 分配空间,然后您尝试在其上复制一个字符串。 ch 是一个不属于你的未初始化内存地址。

你需要为字符串分配空间:

char *ch = new[(MAX_SIZE + 1) * sizeof(char)];

但是为什么你需要char * 呢?请注意,如果您必须有 C 字符串,则始终可以传递 a 并使用 a.c_str()。我不确定Word 是什么,或者它是否需要它自己的字符串副本,但你可以使用:Word cwd(a.c_str())

【讨论】:

  • 如果我发现有人在 C++ 程序中使用 malloc,我会用他们自己的程序列表将他们打死 :-)
  • 感谢您的帮助。我必须在学校的最后一次作业中创建这个 Word 类,但是没有必要的字符串构造函数,或者不能直接使用 a.c_str() 函数返回我的 Word 类没有的 const char*。
  • 同意@paxdiablo 使用 new 而不是 malloc
  • @pb2q 很酷 - 当你混合它们时会发生奇怪的事情 - 很难调试:-)
  • @AdrianCornish 当然,我避免混入实际代码,但在发布答案时,我有时不会过滤。但这主要是一个 C++ 问题
【解决方案2】:

您似乎没有为char *ch 分配内存。定义此变量的那一刻,它是堆栈上的随机值。写入随机内存会破坏内存并在清理内存时(手动或在函数返回时自动)导致段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多