Проблемы со списком и строками в C - PullRequest
2 голосов
/ 04 мая 2011

Я составил список для обработки данных, и у меня возникла проблема, из-за которой я не нашел причину, для меня мой код кажется правильным, но есть проблемы.

Что я пытаюсьсделать следующее: у меня есть список, который содержит х элементов.Я хочу добавить элемент p в список, затем взять каждый элемент x, добавить p в строку, которую они представляют, и добавить их в список.(сам по себе список работает отлично, именно эта операция вызывает проблемы).

Проблема в том, что когда я делаю это и пытаюсь отобразить список, первые элементы x + p отображаются хорошо, но послеЯ вижу некоторые странные символы, которые не имеют никакого отношения к входам.

Вот функции, которые я использую:

void addFirst(struct list *l, char *key)
{
  struct node *x = createNode(key) ;
  if (l->size == 0)
  {
    l->first = x;
  }
  else
  {
    x->next = l->first;
    l->first = x;
  }
  l->size++;
  return;
}

void showList(struct list* l)
{
    struct node *p=l->first;
    while (p!=NULL)
    {
        printf("%s \n",p->key);
        p=p->next;
    }
    return;
}

void copyPlus(struct list* l,char *ch)
{
    struct node *p=l->first;
    addFirst(l,ch);
    while (p!=NULL)
    {
        int len1=strlen(p->key);
        char cat[len1+2];
        strcpy(cat,p->key);
        strcat(cat,ch);
        cat[len1+1] = '\0';
        printf("[%s] \n",cat);
        addFirst(l,cat);
        printf("{%s} \n",l->first->key);
        p=p->next;
    }
    return;
}

int main()
{
    struct list *A=createList();
    addFirst(A,"1");
    addFirst(A,"2");
    addFirst(A,"4");
    copyPlus(A,"3");
    printf("=%s= \n",A->first->key); //this one works!
    printf("=%s= \n",A->first->next->key);
    printf("=%s= \n",A->first->next->next->key);
    showList(A);
    deleteList(A);
}

Я пропустил ненужные вещи, это классический список.

Узел определен таким образом:

struct node
{
  struct node *next;
  char *key;
};

После дальнейшего исследования выясняется, что процесс работает правильно (два // printf в copyPlus работают так, как они должны).И последний // printf ничего не отображает, даже если я сделаю A-> first-> next-> next-> next.Это показывает 3, если я делаю A-> first-> next-> next-> next-> next.

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

Может ли кто-нибудь мне помочь?Спасибо.

1 Ответ

2 голосов
/ 04 мая 2011

Хорошо, поэтому strcat добавляет в строку завершающий ноль, вам нужно место для еще одного символа. strlen даст вам 1, вы выделите массив символов размером 2. Этого недостаточно - вам нужно как минимум 3 для первого символа, второго символа и конечного нуля. Это все еще опасно, так как вы не знаете длину второй строки. Таким образом, лучшим решением будет char* cat = malloc(len1 + len2 + 1).

В настоящее время проблема заключается в том, что char cat[len1+2]; выделяет пространство в стеке (там находятся локальные переменные функции). Вы в основном держите указатель на адрес внутри стекового фрейма, который уничтожается после завершения функции. Первое значение работает, потому что это был ваш последний вызов функции, и до сих пор никто не решил перезаписать эту память (но любой может сделать это ). При выделении с помощью malloc() будет выделяться куча , и это значение будет доступно до тех пор, пока вы явно не вызовете free.

После изменений вывод:

[43]
{43}
[23]
{23}
[13]
{13}
=13=
=23=
=43=
13 23 43 3 4 2 1

Решение C ++ можно найти по адресу http://pastebin.com/xNzyLQ2N.

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