Я хотел бы выделить 2D-массив, и я рассматриваю две возможности (avr-gcc на Arduio):
A:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
Есть ли разница между А и В? Будет ли компилятор создавать один и тот же байтовый код в этих двух случаях (arv-gcc)?
В C вы не можете выделить память new
потому что нет такой вещи. Для C ++ вы можете предпочесть new
по нескольким причинам, таким как:
(std::nothrow)
явно)void *
)Увидеть В каких случаях я использую malloc против new? для дальнейшего обсуждения по этому вопросу.
Если вы хотите выделить двумерный массив и хотя бы самый правый размер известен во время компиляции (т. Е. Он может быть константным выражением), вам не нужно зацикливаться.
int (*arr)[10] = new int [2][10];
Если вы хотите, чтобы он был предварительно установлен с нулями (то есть, как std::calloc
), затем используйте:
int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10](); // C++03
Как и для любых массивов, выделенных new[]
есть соответствующий delete[]
Оператор освободить его:
delete[] arr;
int (*arr)[10] = malloc(5 * sizeof(*arr));
Это выделяет массив, который как arr[5][10]
(только в смысле показателей).
Для доступа к его элементам в обоих просто используйте:
arr[a][b]
Чтобы освободить его, вы в основном делаете:
free(arr);
В C ++ вам также необходимо позаботиться о приведении и, возможно, квалифицировать его как std
, так что это std::malloc
(особенно если включить cstdlib
, как stdlib.h
заголовок устарел в C ++ Standard):
const int N = 10;
int (*arr)[N] =
static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
но я не думаю, что вам понравится.
Если вы используете компилятор C ++ (и наброски Arduino являются C ++), вы, вероятно, должны предпочесть new
, Это вряд ли имеет значение для простого int
массив, но я бы оставил C устаревшие вещи только для кода, который имеет работать в среде C.
В настоящее время нет абсолютно никаких оснований для программистов на C + (эта любопытная порода программистов, которая никогда не переходит от всего сердца к C ++) 🙂
А и В в основном эквивалентны.
Компилятор может или не может создать один и тот же код (не байтовый код BTW). Но часто используя new
Оператор просто сводится к вызову malloc
, Чтобы узнать, скомпилируйте вашу программу с gcc -S
и посмотрите на вывод сборки.
Но для программ на С ++ вы должны предпочесть new
в malloc
,