我已经为此挠头好几个小时了,但仍然不明白为什么我的代码有问题。我已确保初始化 2D 数组中的每个值,因此任何地方都不应该出现未初始化值错误!
注意:我不能在该项目中使用 STD::VECTOR。我还使用不同的函数而不是 std::min() 因为我不允许为此项目导入算法。
这是clang-tidy报告的错误:
2nd function call argument is an uninitialized value
这是我的代码(错误仅发生在第 17 行):
int** SeamCarver::CarvingSeamVertical() const {
int** energies = new int*[height_];
for (unsigned int row = 0; row < height_; row++) {
energies[row] = new int[width_];
for (unsigned int col = 0; col < width_; col++) {
energies[row][col] = 0; // initializes every value in the 2D array to zero
}
}
for (unsigned int col = 0; col < width_; col++) {
energies[height_ - 1][col] = this->GetEnergy(height_ - 1, (int)col);
}
for (int row = height_ - 2; row >= 0; row--) {
for (int col = 0; col < width_; col++) {
int best = 0;
if (col == 0) { //error occurs here v
best = FindMinTwo(energies[row + 1][col], energies[row + 1][col + 1]);
} else if (col == width_ - 1) {
best = FindMinTwo(energies[row + 1][col - 1], energies[row + 1][col]);
} else {
best = FindMinThree(energies[row + 1][col - 1],
energies[row + 1][col],
energies[row + 1][col + 1]);
}
energies[row][col] = this->GetEnergy(row, col) + best;
}
}
return energies;
} // energies is properly deallocated by the function that uses it
我尝试将整数更改为无符号整数,但错误并没有消失。我也不应该遇到越界访问错误,因为行从
height - 2
开始,并且循环内访问的行的最高值是 height - 1
。
第17行,您访问
energies[row + 1][col + 1]
,在第二维中,数组仅被分配和初始化,直到width_ - 1
,但col + 1
最终等于width_
将 for 循环范围更改为 [1; width_ - 1[ 或分配一个更大的数组并初始化它。