#c #pointers #malloc #local #free
#c #указатели #malloc #Местные новости #Бесплатно
Вопрос:
У меня есть код на C, похожий на этот. Как я могу освободить указатель и вернуть его? Если я создаю другую локальную переменную указателя и присваиваю p
этой локальной переменной указателя, отображается предупреждение о том, что указатель на локальную переменную не может быть возвращен. Обратите внимание, что у меня есть рекурсия, поэтому я хочу освободить указатель в самой функции.Любое обходное решение. Заранее спасибо.
char * ABCfunction(){
char * p = malloc(10*sizeof(char));
//do something with p
ABCfunction();
return p;
//free(p); //Want to do both.
}
ОБНОВЛЕНИЕ: Да, я знаю, что это не имеет смысла, и мы не можем сделать и то, и другое. Я прошу альтернативный подход. Проблема в том, что если я не освобождаю указатель, он потребляет много памяти для высоких входных значений. Я хочу избавиться от высокого использования памяти.
Комментарии:
1. Вы не можете. Если вы хотите вернуть указатель, вы не можете освободить память, на которую он указывает, это так просто.
2. Нет смысла делать и то, и другое. Если вы освободите
p
, возвращаемое вами значение будет недействительным и бесполезным. Вы освобождаете память только один раз, когда закончите с ней, даже если это происходит в другой функции через другую переменную указателя.3. Да, я знаю, что это не имеет смысла, и мы не можем сделать и то, и другое. Я прошу альтернативный подход. Проблема в том, что если я не освобождаю указатель, он потребляет много памяти для больших входных значений. Я хочу избавиться от высокого использования памяти.
4. AFAI вижу, что вы не делаете ничего,
p
что связано с рекурсивным вызовом. Я думаю, вы должныABCfunction()
сначала вызвать, а затем выделитьp
, что-то с этим сделать, а затем вернуть указатель. Как только вы закончите со значением, возвращаемымABCfunction
вами, вы должны освободить его в своей вызывающей функции.5. @zapstar Это не точный код. Это просто аналогичный код, и я что-то делаю с возвращаемым значением
p
.
Ответ №1:
Хочу сделать и то, и другое.
Это не очень хорошая цель.
Если вы освободите указатель, вы не должны возвращать указатель. В противном случае вызывающая функция получит висячий указатель.
Обратите внимание, что у меня есть рекурсия, поэтому я хочу освободить указатель в самой функции.
Убедитесь, что вы захватили возвращенный указатель, используете его, а затем освободите его.
Вот как должна выглядеть ваша функция:
char * ABCfunction()
{
char * p = malloc(10*sizeof(char));
//do something with p
char* p1 = ABCfunction();
// Use p1.
// Then free p1
free(p1);
return p;
}
Комментарии:
1. Могу ли я использовать оператор
free(p)
вне функции после его использования?p
является локальной переменной.2. @bharadwaj, да.
p
является локальной переменной, но ее значение может быть возвращено и использовано в вызывающей функции.3. Хорошо. Что происходит с возвращаемым значением других рекурсивных функций, вызываемых .
ABCfunction()
Они уже освобождены?4. @bharadwaj, как и в вашем опубликованном коде, значение, возвращаемое из рекурсивных вызовов, не фиксируется. Как следствие, у вас есть утечки памяти. Нет, они не освобождаются.