У меня есть проект, и я должен определить массив массивов разных измерений (например, треугольник), потому что мне не разрешено использовать std :: vector или другой контейнерный класс. Для этого я использую массив указателей. Обычно я бы сделал это:
int* triangle[n];
for(int i = 0; i < n; i++) {
triangle[i] = new int[i + 1];
for(int j = 0; j <= i; j++) cin >> triangle[i][j];
}
Но я не должен использовать динамическую память! Я думал что делаю
int* triangle[n];
for(int i = 0; i < n; i++) {
int row[i + 1];
triangle[i] = row;
for(int j = 0; j <= i; j++) cin >> triangle[i][j];
}
сделал бы трюк. Но это не так. Вместо этого, когда я перебираю массивы и распечатываю содержимое, я получаю мусор. Итак, как я могу заменить динамическое распределение статическим?
Итак, если вы хотите, чтобы «массив массивов» был упрощен, ваш выбор — линеаризация массива. Это означает, что вместо 7 массивов по 10 элементов в каждом вы должны объявить один массив из 70 элементов. Затем просто измените вложенные индексы с помощью функции, которая вычисляет результирующий сдвиг в линеаризованном массиве, и альта!
Здесь вы можете найти один из таких примеров: Как сопоставить индексы матрицы с одномерным массивом (C ++)?
Если вы заранее не знаете, как долго ваш массив, определить предварительный размер резервирования может быть непросто (например, контейнеры STL, такие как vector и т. Д., Делают то же самое: они выделяют кусок памяти, а затем увеличивают объем памяти). контейнер до освобождения свободной емкости, затем перераспределить больший кусок, перемещая данные из старого в новый буфер, и снова, и снова, и снова …)
Как отметил @BeyelerStudios в комментариях, в конце цикла for память, выделенная для row
массив освобождается. Когда я пытаюсь распечатать содержимое, я разыменую указатели на эту освобожденную память, поэтому я получаю мусор. Спасибо!