C ++ 2D动态数组分配

时间:2012-12-05 17:26:10

标签: c++ arrays pointers dynamic multidimensional-array

我有一个float**数组,其中包含num_rows行和num_cols列。我想确定0-9列之间每个数字的出现次数。为此,我考虑使用另一个大小为[10][num_cols]的2D数组,以便对于每一列,与元素对应的数字是原始表中该数字的出现次数。 示例:如果原始表在第五列中包含1 2 3 1 1,则在第二列中,值应为:1-> 3, 2 -> 1, 3 -> 1

我尝试使用如下函数,但它给了我一个指针错误。我尝试过使用矢量,但这也没有带来好运。

int ** attribute_count(float * * input, int row_num, int col_num) {
    int ** arr_2 = new int * [10];
    int * arr = new int[10 * col_num];
    int counter = 0;

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < col_num; j++) {
            arr_2[i][j] = 0;
        }
    }

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < col_num; j++) {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}

编辑: 我试过你的建议。新代码是:

    int** attribute_count(float** input, int row_num, int col_num) {
    int** arr_2 = new int* [10];
    int* arr = new int[10 * col_num];
    int counter = 0;

    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < col_num; j++) {
            arr_2[i] = new int[col_num];
        }
    }

    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < col_num; j++) {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}

这仍然给我带来内存错误。该函数在.cpp中被调用,如下所示:

int** attr = attribute_count(training_data, 10, num_cols_train);
    cout<<attr[5][1];

知道我现在做错了什么?

3 个答案:

答案 0 :(得分:1)

arr_2被定义并分配为指向int的指针数组,但实际上并没有分配/分配这些指针。

这是纠正你的代码的一个例子 - 但是我不相信你有正确的行和列...

int ** attribute_count(float ** input, int row_num, int col_num)
{
int ** arr_2 = new int * [10];

    for (int i = 0; i < 10; i++)
    {
        arr_2[i] = new int[col_num];
        for(int j = 0 ; j < col_num ; j++)
        {
            arr_2[i][j] = 0;
        }
    }

    for (int i = 0; i < row_num; i++)
    {
        for (int j = 0; j < col_num; j++)
        {
            int temp = input[i][j];
            arr_2[temp][j]++;
        }
    }
    return arr_2;
}

答案 1 :(得分:1)

您只分配了arr_2的一个维度。您需要遍历并在每个int上分配一个int数组以获得第二维。

编辑:此外,arr有什么用?您分配它,从不使用它,不返回它,并且不释放它。这就是我们拼写内存泄漏的方式。

答案 2 :(得分:1)

我认为您的问题在于2D阵列的错误分配。尝试

int ** arr_2 = new int* [row_num];
for (int i = 0; i < row_num; i++)
    arr_2[i] = new int[col_num];