我有一个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];
知道我现在做错了什么?
答案 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];