с ошибкой 0XC00..FD, компилирую в CLion (хип = +- 12ГБ), в коде открытых косяков нет, дебаггинг тоже с 0хС00..FD падает. В чем может быть ошибка?
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n;
cin >> m;
int matrix [n][m];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
matrix[i][j] = rand() / 1000;
}
}
return 0;
}
Именно поэтому VLA и является злом (из-за возможности незаметно выжрать стек)
Понял. Поменял на такое (тоже крашится с той же ошибкой): int main() { int matrix [5000][5000]; for (int i = 0; i < 5000; ++i) { for (int j = 0; j < 5000; ++j) { matrix[i][j] = rand() / 1000; } } return 0; } Выделяю 5000^2 * 4 / 1024 / 1024 = ~95MB под 2д-массив, крашиться не должно 🤔
У вас заканчивается стек
В данном примере под созданный массив память выделяется не в куче, а на стеке
Я всё-таки раскрою изначальную мысль: стек не резиновый и достаточно маленький, VLA позволяют отожрать произвольную часть стека, особенно если не контролировать пользовательский ввод.
Для такого большого массива выделяйте память в куче, используя оператор new (если очень хочется все контролировать), но самое правильное решение - это использовать std::vector
И не использование двумерных массивов
для двумерного массива vector не лучшее решение. но нормального стандартного решения нет. может таки к С++23 комитет сподобится на mdarray
Двумерные массивы не нужны вообще
Пользователи BLAS смотрят на вас с недоумением
Для расчётов физических, химических расчётов в основном они и нужны, если вам кажется, что их мало, то откройте top500 и подумайте зачем все эти суперкомпьютеры строятся
Даже там он одномерный
Тоже слышал что стек довольно маленький, большие данные там лучше не хранить
Matrix Storage Schemes for BLAS Routines Matrix arguments of BLAS and CBLAS routines can use the following storage schemes: Full storage: a matrix A is stored in a two-dimensional array a, with the matrix element Aij stored in the array element a[i + j*lda]
и для кого там написано two-dimensional array ?
Да хоть 100500 dimensional array, де факто все хранится в одномерном
Обсуждают сегодня