时间:2011-05-05 15:49:17

标签: c++ bus-error

我正在尝试使用2D数组生成C ++中所有的矩阵,但是当我尝试写入超过735个字符时我有一个BUS ERROR,我想我的内存分配有问题,你能帮我吗? ?

#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";
        }

6 个答案:

答案 0 :(得分:3)

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

sizeof看起来也有点奇怪;是的 我第一次看到用int指定的元素大小 一个常数。在这种情况下,常量具有类型int*,和 你分配给std::vector<int>,所以你可能已经幸运了。 但{{1}}似乎更合适。

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

答案 1 :(得分:1)

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

array[1][symbols]

您应该使用循环变量:

array[i][j]

答案 2 :(得分:1)

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

#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];
        }
    }

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果你只想在文件中写一堆'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));