C++ 2D 动态阵列分配

C++ 2D dynamic array allocation

本文关键字:分配 阵列 动态 2D C++      更新时间:2023-10-16

我有一个包含num_rows行和num_cols列的float**数组。我想确定 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];

知道我现在做错了什么吗?

我认为您的问题在于 2D 数组的分配不正确。尝试

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

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

编辑:另外,arr怎么了? 你分配它,从不使用它,不返回它,也不取消分配它。 这就是我们拼写内存泄漏的方式。

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