【问题标题】:Bus error when trying to write in FILE尝试写入 FILE 时出现总线错误
【发布时间】:2011-05-05 15:49:16
【问题描述】:

我正在尝试使用 2D 数组在 C++ 中生成所有矩阵,但是当我尝试写入超过 735 个字符时出现 BUS 错误,我认为我的内存分配有问题,请你帮帮我?

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

#define symbols 800

int main ()

{

    fstream file("/Users/Caste/Documents/MAESTRIA/PROGRAMMING TEST/CAPACITY/test1.txt",ios::out);

    int *ptr;
    ptr =(int*)calloc(symbols, sizeof(symbols));
    int i,j,array[1][symbols];
    for (i=0; i<1; i++)
    {
        for (j=0; j<symbols; j++) 
            array[1][symbols]=1;
    }
    cout << "Array indicates:\n";
    for (i=0; i<1; i++) {
        for (j=0; j<symbols; j++) 

            file<<array[1][symbols];
            file.close();

        cout << "\n";
        }

【问题讨论】:

  • 这是 C 和 C++ 的邪恶组合。好的 C++ 看起来不一样。

标签: c++ bus-error


【解决方案1】:

可能还有其他错误,但对于初学者来说,你是 使用array[1](第二个元素),当array只有 一个元素(int[symbols] 类型)。未定义的行为,以及 既然你在写,你肯定会破坏其他对象 在堆栈上。

calloc 看起来也有点奇怪;这是 我第一次看到用sizeof 指定的元素大小 一个常数。在这种情况下,常量的类型为int,并且 你正在分配给int*,所以你可能很幸运。 但std::vector&lt;int&gt; 似乎更合适。

当然,您在第一次写入后关闭文件, 这意味着以后的所有写入都将是空操作。

【讨论】:

    【解决方案2】:

    在您的循环中,您通过用于声明它的常量访问数组:

    array[1][symbols]
    

    你应该使用你的循环变量:

    array[i][j]
    

    【讨论】:

    • 但还要注意,由于它被定义为[1],所以您可以使用的唯一下标是0,不是 1 .
    • 同意。幸运的是,i 上的循环是可以的 (for (i=0; i&lt;1; i++) )。
    • 对——但我认为你将其归因于运气是完全正确的。
    【解决方案3】:

    感谢大家的帮助,这真的很有帮助,我在这里发布我减少它的最终代码:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    #include <cstring>
    
    using namespace std;
    
    #define symbols 1000000
    //#define SNR 7
    
    int main () 
    {
        fstream file("/Users/Caste/Documents/MAESTRIA/PROGRAMMING TEST/CAPACITY/test1.txt",ios::out);
        int channel[1][symbols];
        memset((void*)channel, '\0', symbols);
        for (int i=0; i<1; i++) 
            for (int j=0; j<symbols; j++) {
                channel[i][j]=1;
            }
        for (int i=0; i<1; i++) {
            cout << endl;
            for (int j=0; j<symbols; j++) 
                //cout << channel[i][j];
                file<<channel[i][j];
            }
        }
    

    【讨论】:

      【解决方案4】:

      ptr =(int*)calloc(symbols, sizeof(symbols));
      应该是
      ptr =(int*)calloc(symbols, sizeof(int));

      我不确定这是否会直接导致您的问题。

      【讨论】:

        【解决方案5】:

        您的程序中有许多逻辑错误,但我认为导致崩溃的问题是您正在关闭嵌套循环中的文件,然后尝试对其进行写入。

        【讨论】:

          【解决方案6】:

          如果您只是想将一堆 '1' 写入文件,为什么不这样做:

          std::ofstream file("whatever path");
          
          std::fill_n(std::ostream_iterator<int>(file), how_many, 1);
          

          编辑:要先将数据放入向量中,然后复制到文件中,您可以执行以下操作:

          std::vector<int> data;
          
          std::fill_n(std::back_inserter(data), how_many, 1);
          

          要将其复制到文件中,您可以执行以下操作:

          std::copy(data.begin(), data.end(), std::ostream_iterator<int>(file));
          

          【讨论】:

          • 谢谢,这项工作,但是我想生成 1000000 个,并将其放入向量中,因为稍后我将在不同的处理中使用此向量,感谢您的帮助。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-17
          • 2015-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          相关资源
          最近更新 更多