Вы пометили свой вопрос как C ++, так и C, но второе решение не разрешено в C ++.Массивы переменной длины разрешены только в C (99).
Если предположить, что len является константой, оба сработают.
malloc () (и C ++ 'new')Выделите память в куче, что означает, что вы должны освободить () (или, если вы выделили 'new', 'delete') буфер, или память никогда не будет восстановлена (утечка).
последний выделяет массив в стеке и исчезнет, когда выйдет из области видимости.Это означает, что вы не можете возвращать указатели на буфер вне области, в которой он выделен.
Первый вариант полезен, когда вы хотите передать блок памяти (но в C ++ лучше всего управлять с помощью RAIIкласс, а не вручную), хотя последний лучше всего подходит для небольших массивов фиксированного размера, которые должны существовать только в одной области.
Наконец, вы можете пометить массив, выделенный в стеке, как «статический» для принятияон выходит из стека и попадает в раздел глобальных данных:
static char output[(len * 2) + 1];
Это позволяет вам возвращать указатели на буфер вне его области действия, однако все вызовы такой функции будут ссылаться на один и тот же фрагмент глобальногоданные, поэтому не используйте их, если вам нужен каждый раз уникальный блок памяти.
Наконец, не используйте malloc в C ++, если у вас нет действительно веской причины (то есть, realloc).Вместо этого используйте «новый» и сопровождающий «удалить».