* массив [] не инициализирован — Предупреждение анализа кода 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
}

Приведенный выше код работает отлично — единственная проблема заключается в том, что при запуске анализа кода появляется предупреждение (безопасность памяти) C6001 — «* arrTemp [i]» не инициализирован.

Я не совсем понимаю, почему он думает, что он не инициализирован — у меня также есть такая функция для 3D-массивов (конечно, все с динамическим распределением памяти), и там нет никаких проблем.

Я пытался исправить это несколько раз, но безрезультатно:
1. Инициализация в nullptr после создания нового int * [];
2. Инициализация значений двумерного массива до 0 после завершения цикла;
3. Несколько других глупостей …..

Итак, это ошибка в Visual Studio (которую я, кстати, использую :)) или это что-то в моем коде, которую я не могу обнаружить?

Постскриптум
Добавлены комментарии;

-2

Решение

Ваш код генерирует это предупреждение, потому что, когда вы строите свой arrTemp Вы выделяете arraySize1 + 1 подмассивов

for (short i(0); i < arrSize1 + 1; i++)
arrTemp[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];

но назначать значимые значения только arraySize1 из этих подмассивов

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

который пытается прочитать мусор из arrTemp[arrSize1][i2], Отсюда и предупреждение.

0

Другие решения


По вопросам рекламы [email protected]