char f() {
char a = 'a';
return &a;
}
Переменная a
перестает существовать после возврата из функции. Таким образом, после возврата функции переменная a
не существует, адрес переменной &a
недействителен после возврата функции, там нет памяти после возврата функции.
char **f2() {
char *b = "abc";
return &b;
}
Это то же самое. Переменная b
не существует после функции, поэтому адрес переменной b
недействителен после возврата функции. Неважно, если это указатель. Адрес, хранящийся в переменной b
, все еще действителен, но адрес переменной b
недействителен после возврата функции.
Просто возвращайте указатель по значению, а не указатель на указатель.
//add quotes around a single word
char* _add_quotes(char* word){
...
char* word_quotes = malloc((char_count+3) * sizeof(*word_quotes));
...
// this is the value as returned by malloc()
// the pointer value returned by malloc still valid after the function returns
return word_quotes;
}
И ваша функция может быть переписана для использования стандартных библиотечных функций:
char* _add_quotes(char* word){
char* word_quotes = calloc((strlen(word) + 3), sizeof(*word_quotes));
if (word_quotes == NULL) return NULL;
strcat(word_quotes, "\"");
strcat(word_quotes, word);
strcat(word_quotes, "\"");
return word_quotes;
}
или даже:
char* _add_quotes(char* word){
char* word_quotes = calloc((strlen(word) + 3), sizeof(*word_quotes));
if (word_quotes == NULL) return NULL;
sprintf(word_quotes, "\"%s\"", word);
return word_quotes;
}