【问题标题】:C++ 2D dynamic array allocationC++ 2D 动态数组分配
【发布时间】:2012-11-23 14:45:00
【问题描述】:

我有一个 float** 数组,其中包含 num_rows 行和 num_cols 列。我想按列确定 0-9 之间每个数字的出现次数。为此,我想到了使用另一个大小为[10][num_cols] 的二维数组,这样对于每一列,对应于一个元素的数字就是该数字在原始表中出现的次数。 示例:如果原始表在第五列中包含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];

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

【问题讨论】:

  • “指针错误”的确切说法是什么?您没有为二维数组中的每个索引分配内存。

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


【解决方案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;
}

【讨论】:

  • 试过了,还是很麻烦。请参阅我在主要问题中所做的编辑。
  • 你的改变并没有变得更好。你现在分配和循环都太多了。
  • 你能写出正确的代码吗?我是这种编程的新手,非常感谢您的帮助!
【解决方案2】:

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

编辑:另外,arr 是怎么回事?你分配它,从不使用它,不要归还它,也不要释放它。这就是我们拼写内存泄漏的方式。

【讨论】:

  • 试过了,还是很麻烦。请参阅我在主要问题中所做的编辑。
【解决方案3】:

我认为您的问题在于二维数组的分配不正确。试试

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

【讨论】:

  • int** attribute_count(float** input, int row_num, int col_num) { int** arr_2 = new int* [10]; int* arr = new int[10 * col_num];整数计数器 = 0; for (int i = 0; i
  • 试过了,还是很麻烦。请参阅我在主要问题中所做的编辑。
  • @Nathan822 您的索引非常混乱。 row_num 通常用于表示行数,col_num 用于表示列数。在您的代码中,您使用10 表示列号,使用col_num 表示行。此外,arr 变量似乎未使用。
  • 我使用 10 作为 row_num,因为我想跟踪这 10 个数字。
  • @Nathan822 “跟踪 10 个数字”是什么意思?在您的代码中,您使用10 列和col_num 行创建二维数组arr_2。此外,您使用10 * col_num 单元创建名为arr 的一维数组。请注意,您不要在函数中使用 arr。它的目的是什么?
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2013-01-27
  • 2012-04-20
相关资源
最近更新 更多