c - C 链表中不可能的结果

标签 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(){
    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);
    }
}

这是我得到的结果:

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

谁能解释一下这是怎么回事??? 我的意思是当我输入第二个值时 最新的节点值必须是我输入的第一个值,但它是新输入的!

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

最佳答案

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

#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)和代码

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

不要忘记稍后释放堆内分配的内存区域!阅读 memory management & C dynamic memory allocation & memory leak维基页面。另请考虑valgrind ...

使用所有警告和调试信息进行编译 (gcc -Wall -g) 并使用调试器 (gdb)。或者至少,调试打印内存区域的地址,例如在几个地方放一行像

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

关于c - C 链表中不可能的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060398/

相关文章:

linked-list - 交换单链表中的两个节点

c - double 型矩阵 [n]x[n] 传输至 ASSEMBLY

C++ long long int 上溢/下溢

c - 高分辨率的 C 语言精确计时

c - 链表节点属性每次都更新为最新值

c - 这个链表代码是一个好习惯吗?

c - 使用 C 中的结构将数据存储到动态数组中

macos - 您无权访问此服务器上的/- Mac OS X Mojave 上的 Apache 2

ruby-on-rails - 加载错误 : cannot load such file -- bundler/setup

objective-c - OSX Cocoa 错误指令崩溃