kasandra77 Ответов: 1

Как дать параметру внутреннюю часть другого указателя?


я хочу сохранить имя в структуре чего-то в другой копии , чем исходная копия, которую я получил в качестве параметра, я сделал это, но это неправильно из-за свободной вещи .. но я должен сделать это бесплатно внутри этой функции, я думаю ... когда я пытаюсь запустить свою программу в eclipde, она просто говорит мне, что у меня что-то не так, и то же самое происходит, когда я пытаюсь запустить debbug .. я точно знаю, что проблема в free, потому что если я удаляю free, то все работает идеально !

Что я уже пробовал:

<pre>typedef struct Ssomething {
  int num;
  char *name;
  Level level;
} Something;


Result copy_name(Something *something, char *name) {
  if (something == NULL || name == NULL) {
    return NULL_PARAMETER;
  }
  char *name2 = malloc(strlen(name) + 1);
  if (name2 == NULL) {
    return MEMORY_PROBLEM;
  }
  memcpy(name2, name, strlen(name) + 1);
  something->name = name2;
  free(name2);
  return OK;
}

1 Ответов

Рейтинг:
1

Richard MacCutchan

char *name2 = malloc(strlen(name) + 1); // allocate new buffer for name2
// ...
memcpy(name2, name, strlen(name) + 1); // copy name to newly allocated buffer
something->name = name2;               // save the pointer in the struct
free(name2);                           // free the buffer just allocated

Так вы создаете name2 а потом сразу же выбросить. Неудивительно, что программа терпит неудачу.


kasandra77

да, я знаю, что это проблема !! я спрашиваю, есть ли другой способ сделать это.
"я точно знаю, что проблема в free, потому что если я удаляю free, все работает идеально "

Richard MacCutchan

Конечно, это так, потому что у вас все еще есть буфер памяти, выделенный вам. Вы не можете освободить блок и ожидать, что он останется в существовании.

kasandra77

могу ли я решить эту проблему с помощью * * char ? может быть, это решит проблему

Richard MacCutchan

Нет никакой проблемы, которую нужно решить. Вы не должны освобождать выделенный блок памяти до тех пор, пока он вам больше не понадобится. Пока он содержит "активные" данные, вы не должны освобождать его. Мне кажется, у вас есть фундаментальное непонимание того, что такое указатель.

kasandra77

ладно теперь я все понял лол ТНХ