*数组[]未初始化-代码分析警告C6001
*array[] is not initialized - Code Analysis Warning C6001
因此,我编写了一个函数来调整二维数组的大小。
void resizeArray(int **&arr, short &arrSize1, short* &arrSize2, const int &amount)
{
int** arrTemp = new int*[arrSize1 + 1]; // Creating a 2D array
for (short i(0); i < arrSize1 + 1; i++) // For each arrTemp[i] an array is created
arrTemp[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];
for (short i(0); i < arrSize1; i++) // Copying old values to the new BIGGER temp array
for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
arrTemp[i][i2] = arr[i][i2];
for (short i(0); i < arrSize1; i++)
delete[] arr[i];
if (arrSize1) // The first time this function is ran arrSize1 is 0 and arr is a nullptr
{
delete[] arr;
arr = nullptr;
}
arr = new int*[arrSize1 + 1]; // Creating the new BIGGER arr
for (short i(0); i < arrSize1 + 1; i++) // Creating the sub-arrays(or second dimension)
arr[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];
for (short i(0); i < arrSize1 + 1; i++) // Copying from arrTemp to arr
for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
arr[i][i2] = arrTemp[i][i2];
for (short i(0); i < arrSize1 + 1; i++) // Deleting arrTemp
delete[] arrTemp[i];
delete[] arrTemp;
arrTemp = nullptr;
for (short i(0); i < (arrSize2[arrSize1] == 0 ? 1 : arrSize2[arrSize1]); i++)
arr[arrSize1][i] = amount; // Setting the newly created sub-array to a value
}
上面的代码运行得很好——唯一的问题是当我运行代码分析时,它说Warning(Memory Safety)C6001-"*arrTemp[I]"没有初始化。
我不太明白为什么它认为它没有初始化——我对3D阵列也有这样的函数(当然是所有具有动态内存分配的函数),它没有显示出任何问题。
我试着修复了好几次,但都无济于事:1.在完成新的int*[]之后初始化为nullptr;2.循环完成后,将2D阵列的值初始化为0;3.其他一些愚蠢的事情。。。。。
那么,这是Visual Studio中的错误(顺便说一句:)还是我的代码中找不到的东西?
p.S。添加了评论;
您的代码会生成此警告,因为当您构建arrTemp
时,您会分配arraySize1 + 1
子阵列
for (short i(0); i < arrSize1 + 1; i++)
arrTemp[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];
但是仅将有意义的值分配给那些子阵列的CCD_ 3
for (short i(0); i < arrSize1; i++)
for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
arrTemp[i][i2] = arr[i][i2];
之后,像arrTemp[arrSize1][i2]
这样的所有条目仍然包含垃圾。
稍后你做
for (short i(0); i < arrSize1 + 1; i++)
for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
arr[i][i2] = arrTemp[i][i2];
其尝试从CCD_ 5读取垃圾。因此发出警告。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- GCC对可能有效的代码抛出init list生存期警告
- 返回语句后的代码,没有警告
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- Clang 给了我符号更改的警告,但代码仍然产生正确的输出
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 如何在C++中禁用代码声纳警告
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- Cppcheck 静态代码分析器实际上可以检测到不太常见的警告(如 "Relative Path Traversal (CWE-23)" 或"Buffer Under-read(CWE-127)")吗
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- 在VS2017代码分析中抑制外部标头的警告
- 使用代码调整删除"comparison is always false"警告
- 我的代码错误类型警告 1 警告 C4018 和更多错误
- 我不想导出的函数的未记录代码对象警告
- 如何在代码块 IDE 上修复此警告,警告:按值 [-Wcatch-value=] 捕获多态类型"类 std::d omain_error"
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- snprintf:相同的代码-在不同的g++编译器上有不同的错误/警告
- 警告级别4中的不可访问代码警告
- 如何避免由于编译器错误而导致无法访问的代码警告