Когда вы объявляете переменную как здесь
int a[10][10];
вы говорите компилятору C ++, что вы хотите, чтобы 100 последовательных целых чисел выделялись в памяти программы во время выполнения. Затем компилятор предоставит вашей программе столько доступной памяти, и все будет хорошо с миром.
Если вы все же скажете компилятору
int x = 9001;
int y = 5;
int a[x][y];
компилятор не имеет возможности узнать, сколько памяти вам действительно понадобится во время выполнения, без проведения очень сложного анализа, чтобы отследить каждое последнее место, где значения x и y изменились [если есть]. Вместо того, чтобы поддерживать такие массивы переменного размера, C ++ и C настоятельно рекомендуют, если не прямо, требовать, чтобы вы использовали malloc () для ручного выделения нужного пространства.
TL; DR
int x = 5;
int y = 5;
int **a = malloc(x*sizeof(int*));
for(int i = 0; i < y; i++) {
a[i] = malloc(sizeof(int*)*y);
}
a теперь является двумерным массивом размером 5x5 и будет вести себя так же, как int a [5] [5]. Поскольку вы выделили память вручную, C ++ и C требуют, чтобы вы также удалили ее вручную ...
for(int i = 0; i < x; i++) {
free(a[i]); // delete the 2nd dimension array
}
free(a); // delete a itself