Как освободить указатель сразу после его возврата?

0

эй, это мой первый пост, и это для домашнего задания для моего теоретического класса структур данных. Вопрос, который я задаю, на самом деле не отличается от заданий, но сделает код более чистым, если это возможно. (Если это вызывает беспокойство, задание состоит в том, чтобы сделать калькулятор с обратной полярностью с использованием связанного стека списков).

То, что я хочу сделать, это

char* postEval(char* equation)
{
     char* curChar = equation;
     struct stackNode* stack = NULL;

      /*Alot of processing (hint: stack gets initialized during this)*/

      /****Is there a way to free the node after returning it?? --
           this is pseudo-code!*****/
      return FreeThenReturn(stack->data);  
 }

Я знаю, что я мог бы sprintf() или strcpy() его во временную переменную, чтобы я мог освободить узел, а затем вернуть temp varaible, но есть ли лучший способ?

EDIT: Я не уверен, что неясно, но да, я пытаюсь вернуть копию члена данных (который является символом char) обратно к вызывающей функции. Это проблематично, потому что мне нужно освободить память стека и просто отправить копию данных, хранящихся там. Я знаю, что это странно делать так, но это то, как учитель специально сказал нам сделать это. Мы не можем редактировать определение struct stackNode или прототип postEval() вообще. Описание struct stackNode выглядит следующим образом:

    struct stackNode
    {
          char* data;
          struct stackNode *next;
    }

Кроме того, функция postEval() в основном представляет собой цикл с оператором switch, который анализирует каждый символ переменной "уравнение" и решает уравнение, а затем возвращает ответ в виде char *. Наш учитель просто хочет посмотреть, сможем ли мы его решить, используя стеки... это точка. Я знаю, что было бы проще не делать этого таким образом, но я не делал задания.

  • 4
    Совершенно неясно, что вы просите! Либо семантически (зачем вам это нужно), а также в случае недостаточного примера кода ( укажите MCVE ).
  • 0
    Вы обсуждаете sprintf и strcpy которые намекают на отсутствие понимания, что такое указатель. Ты уверен, что правильно обдумал это?
Показать ещё 4 комментария
Теги:
stack

3 ответа

3

Я думаю, вам, вероятно, нужно что-то сделать в соответствии с этим:

Data *data = stack->data; // or whatever type stack->data is
free(stack);
return data;

но я согласен с комментариями, что вопрос не дает ясности.

Либо вещь, которую вы хотите освободить, и вещь, которую вы хотите вернуть, - это одно и то же (в этом случае ваш план испорчен - нет смысла возвращать то, что уже освобождено, потому что ваш вызывающий абонент не может его использовать), иначе они (в этом случае вам нужно каким-то образом их отделить, но мы не можем точно сказать вам, почему, поскольку вы не сказали нам о них достаточно).

0

Вы можете просто защитить указатель данных и освободить функцию stackNode.

stackNode
[
   Data pointer -----> [data]
]

savePointer ----> [data]

Free stackNode удалит все, кроме данных

return savePointer
0

Не можете ли вы вернуть auto_ptr/unique_ptr (С++ 11)? Что-то вроде:

unique_ptr<stackNode> postEval(char* equation) { unique_ptr<stackNode> stack;..... return stack; }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню