Сделать локальную копию данных, входящих в связанный список - PullRequest
1 голос
/ 09 марта 2010

это не домашняя работа, это просто тот факт, что я не посещал школу более 20 лет, и мне НИКОГДА не приходилось использовать связанные списки для чего-либо вообще. Так что я не в своей стихии. во всяком случае, у меня есть

struct Data_Struct {
    char *Name;
    char *Task;
    char *Pos;
    struct Data_Struct *Next;
};
typedef struct Data_Struct MyData;

Это довольно простая структура для связанного списка.

Как видите, данные хранятся в char *, и когда я заполняю список, я копирую указатели туда. Все хорошо. Проблема начинается, когда эти указатели перезаписываются, и я теряю исходные данные. Я пытался копировать данные в локальный char * malloc'ed в каждом "list_add ()", но я продолжаю сбой или потерю данных. Да, я выделяю достаточно и да, я копирую данные и проверяю, правильно ли они скопированы. Я пытался использовать memcpy, strcpy и т. Д. И т. Д.

Мне нечем пытаться, поэтому мой вопрос в том, как сделать так, чтобы данные, которые я буду добавлять в список, были локальными. как мне скопировать эти символы *, входящие в список, в локальные переменные.

Хотя объяснение того, как это сделать и почему мой код плохой, в порядке, я предпочитаю код с объяснением. Спасибо.

Jess.

1 Ответ

4 голосов
/ 09 марта 2010

Вы не хотите «копировать в локальный», вы хотите делать то, что говорите; выделите новую память, используя malloc(), сохраните там данные и сохраните указатели в узле списка.

Если он у вас есть, вы можете использовать strdup() для объединения malloc() + strcpy() в один вызов.

Трудно понять, при каких обстоятельствах вы испытываете перезапись данных, что вы делаете с узлом (ами) списка, которые вызывают это?

Базовая заготовка должна выглядеть следующим образом для определения вашего узла:

MyData * list_prepend(MyData* head, const char *name, const char *task,
                  const char *pos)
{
  MyData *node = malloc(sizeof *node);
  node->Name = strdup(name);
  node->Task = strdup(task);
  node->Pos = strdup(pos);
  node->Next = head;
  return node;
}

Очевидно, что в этом случае отсутствует обработка ошибок (malloc() и strdup() могут оба потерпеть неудачу). Обратите внимание, что это prepend , и возвращается новый заголовок списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...