Нет, он не протечет, так как уничтожается после завершения getp ();
Это приведет к неопределенному поведению, потому что теперь у вас есть указатель на область памяти, которая больше не содержит того, что вы думаете, и может быть использована любым другим.
Утечка памяти произошла бы, если бы вы сохранили этот массив в куче, не выполняя вызов free ().
char* getp(){
char* p = malloc(N);
//do stuff to p
return p;
}
int main(){
char* p = getp();
//free(p) No leak if this line is uncommented
return 0;
}
Здесь p не уничтожается, потому что он не в стеке, а в куче. Однако после завершения программы выделенная память не освобождается, что приводит к утечке памяти (даже если это происходит после завершения процесса).
[UPDATE]
Если вы хотите вернуть новую c-строку из функции, у вас есть две опции.
- Храните его в куче (как пример
выше или как этот реальный пример , который возвращает дублированную строку);
- Передать параметр буфера
например:
//doesnt exactly answer your update question, but probably a better idea.
size_t foo (const char* str, size_t strleng, char* newstr);
Здесь вам нужно было бы выделить место где-нибудь для newstr (это может быть стек или куча) перед вызовом функции foo. В этом конкретном случае будет возвращено количество символов в newstr.