Невозможный результат в связанном списке c


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

Вот мой код:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef char * String;

typedef struct node{
    String value;
    struct node * next;
    struct node * prev;
}Node;

struct node * createLinkList(){
    struct node * root=malloc(sizeof(Node));
    root->value="head";
    root->prev=NULL;
    root->next=NULL;
    return root;
}

Node * insert(String val,Node * root){
    Node * tempNode=root;
    Node * newNode=malloc(sizeof(Node));
    printf("head value : %sn",tempNode->value );
    while(tempNode->next !=  NULL){
        tempNode=tempNode->next;
        printf("latest node value : %sn", tempNode->value);
    }
    newNode->prev=tempNode;
    newNode->next=NULL;
    newNode->value=val;
    printf("newly added node value : %sn", newNode->value);
    tempNode->next=newNode;
    return root;
}

int main (int argc, char const *argv[])
{
    Node * dblList=createLinkList();
    String val=malloc(sizeof(char)*100);
    for (int i = 0; i < 2; ++i)
    {
        printf("please enter value(node #%i): ",i);
        scanf("%s",val);
        dblList=insert(val,dblList);
    }
}

И вот результат, который я получил:

please enter value(node #0): one
head value : head
newly added node value : one
please enter value(node #1): two
head value : head
latest node value : two
newly added node value : two

Кто-нибудь может объяснить, что здесь происходит???? Я имею в виду, когда я ввел второе значение последнее значение узла должно быть первым значением, которое я ввел, но это новое значение!

Это переполнение стека или я делаю что-то не так!?

1 2

1 ответ:

Вы должны выделить новую строку Внутри цикла , а не перед ним:

#define LEN 100
for (int i = 0; i < 2; ++i)
{
    char* val=malloc(LEN);
    memset (val, 0, LEN);
    printf("please enter value(node #%i): ",i);
    fflush(NULL);
    fgets(val, LEN, stdin);
    dblList=insert(val,dblList);
}

На самом деле вам лучше использовать getline (3) и code

for (int i = 0; i < 2; ++i)    {
    char* line=NULL;
    size_t linsiz=0;
    printf("please enter value(node #%i): ",i);
    fflush(NULL);
    ssize_t linlen = getline(&line,&linsiz,stdin);
    dblList=insert(line,dblList);
}

Не забудьте позже free зоны памяти, выделенные внутри кучи! чтение управление памятью & C динамическое выделение памяти & утечка памяти wikipages. Рассмотрим такжеvalgrind ...

Скомпилировать со всеми предупреждениями и отладочной информацией (gcc -Wall -g) и использовать отладчик (gdb). Или, по крайней мере, debug-вывести адрес зоны памяти, например, поставить в нескольких местах строку типа

    printf("at %s:%d val=%p\n", __FILE__, __LINE__, (void*)val);