Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c链表中的不可能结果_C_Macos_Linked List_Stack Overflow - Fatal编程技术网

c链表中的不可能结果

c链表中的不可能结果,c,macos,linked-list,stack-overflow,C,Macos,Linked List,Stack Overflow,我一直在尝试创建一个简单的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(){

我一直在尝试创建一个简单的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 : %s\n",tempNode->value );
    while(tempNode->next !=  NULL){
        tempNode=tempNode->next;
        printf("latest node value : %s\n", tempNode->value);
    }
    newNode->prev=tempNode;
    newNode->next=NULL;
    newNode->value=val;
    printf("newly added node value : %s\n", 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);
    }
}
任何人都能解释这里发生了什么???? 我是说当我输入第二个值时 最新节点值必须是我输入的第一个值,但它是新输入的值


是堆栈溢出还是我做错了什么

您应该在循环中分配一个新字符串,而不是在它之前:

#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);
}

使用所有警告和调试信息进行编译(例如,
gcc-Wall-g
)。然后使用调试器(例如,
gdb
)。您还可以使用
%p
格式控制调试打印指针…我已经使用gcc-o4.c-mmacosx version min=10.5-Wall-g编译了
val
。最初用
“一”
填充
val
,然后用
“两”
填充它;但这两次,它都指向同一个内存位置,而您的链表仍然包含它for循环内部:
请输入值(节点#0):一个头部值:头部新添加的节点值:一个请输入值(节点#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);
}
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);
}
    printf("at %s:%d val=%p\n", __FILE__, __LINE__, (void*)val);