c链表中的不可能结果
我一直在尝试创建一个简单的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(){
#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);