A char **
- указатель на указатель на первый символ строки. В вашем примере память для указателя char **out
уже выделена в стеке. Вам нужно выделить память для массива символов (строка C), на который out
указывает в куче. То есть вы могли бы сделать что-то вроде:
char **out;
char *str = malloc(strlen(src) * sizeof(char) + 1);
*out = str;
Теперь вы можете (например) безопасно вернуть out
и передать управление памятью, выделенной вызывающей стороне.
Если вы хотите вернуть указатель на первый элемент массива строк (другой способ интерпретации символа **), вам сначала нужно выделить в куче достаточно памяти для каждой строки:
char **out = malloc(amount_of_strings * sizeof(char *));
// Repeat the following for each string in your array...
char *str = malloc(strlen(src) * sizeof(char) + 1);
out[index] = str;