Освободить указатель, локальный для функции, и вернуть указатель

#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, как и в вашем опубликованном коде, значение, возвращаемое из рекурсивных вызовов, не фиксируется. Как следствие, у вас есть утечки памяти. Нет, они не освобождаются.