Вы не можете ответить на этот вопрос сразу за C и C ++, потому что между этими двумя языками и их обработкой многомерных массивов есть принципиальное различие. Таким образом, этот ответ состоит из двух частей:
C ++
Многомерные массивы довольно бесполезны в C ++, потому что вы не можете выделить их с динамическими размерами c. Размеры всех измерений, кроме самого внешнего, должны быть постоянными времени компиляции. Практически во всех случаях использования многомерных массивов, с которыми я сталкивался, параметры размера просто не известны во время компиляции. Поскольку они берутся из размеров файла изображения или какого-либо параметра моделирования и т. Д. c.
В некоторых особых случаях размеры могут быть известны во время компиляции, и в этих случаях нет проблем с использованием многомерных массивов в C ++. Во всех остальных случаях вам нужно либо использовать массивы указателей (утомительно настраивать), вложенный std::vector<std::vector<std::vector<...>>>
, либо одномерный массив с ручным вычислением индекса (подвержен ошибкам).
C
C допускает истинные многомерные массивы с динамическими размерами c начиная с C99. Это называется VLA, и оно позволяет вам создавать полностью динамические многомерные массивы как в стеке, так и в куче.
Однако есть две ловушки:
You может передавать многомерный VLA в функцию, но вы не можете его вернуть. Если вы хотите передать многомерные данные из функции, вы должны вернуть их по ссылке.
void foo(int width, int height, int (*data)[width]); //works
//int (*bar(int width, int height))[width]; //does not work
Вы можете иметь указатели на многомерные массивы в переменных и передавать их в функций, но вы не можете хранить их в структурах.
struct foo {
int width, height;
//int (*data)[width]; //does not work
};
Обе проблемы можно обойти (передать по ссылке, чтобы вернуть многомерный массив, и сохранить указатель как void*
в структуре), но это не тривиально. И поскольку эта функция не используется широко, лишь немногие знают, как это сделать правильно.
Размеры массива времени компиляции
И C, и C ++ позволяют использовать многомерный массивы с размерами, известными во время компиляции. У них нет недостатков, перечисленных выше.
Но их полезность значительно снижается: очень много случаев, когда вы хотите использовать многомерный массив, и у вас нет шансов на шанс знать соответствующие размеры во время компиляции. Пример - обработка изображения: вы не знаете размеры изображения до того, как откроете файл изображения. Аналогично любому физическому моделированию: вы не знаете, насколько велик ваш рабочий домен, пока ваша программа не загрузит свои файлы конфигурации. Et c.
Итак, чтобы быть полезными, многомерные массивы должны поддерживать динамические c размеры imho.