0

我正在尝试使用 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";
        }
4

6 回答 6

3

可能还有其他错误,但对于初学者来说,当只有一个元素(类型)时,您正在使用array[1](第二个元素)。未定义的行为,并且由于您正在编写,因此您肯定会破坏堆栈上的其他对象。arrayint[symbols]

calloc看起来也有点奇怪。这是我第一次看到用sizeof 常数指定的元素大小。在这种情况下,常量具有 type int,并且您分配给 an int*,因此您可能很幸运。但std::vector<int>似乎更合适。

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

于 2011-05-05T16:24:03.460 回答
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];
        }
    }
于 2011-05-06T08:52:40.997 回答
1

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

array[1][symbols]

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

array[i][j]
于 2011-05-05T16:07:37.907 回答
0

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

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

于 2011-05-05T16:02:16.033 回答
0

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

于 2011-05-05T16:07:04.787 回答
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));
于 2011-05-05T16:50:37.457 回答