【问题标题】:Simple c program crashes in windows简单的c程序在windows中崩溃
【发布时间】:2016-08-27 10:00:45
【问题描述】:

我是 c 新手。我有以下创建双链表的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct Dnode
{
    char c;
    struct Dnode *left;
    struct Dnode *right;
}Dnode;
void insert(Dnode *,char);
void unshift(Dnode *,char);
void travel(Dnode *);
int main(){
    Dnode *cur =  (Dnode *)malloc(sizeof(Dnode));
    Dnode *head = NULL;
    head = cur;

    cur -> c = 'a';
    printf("Cur -> c: %c\n",cur->c);
    cur ->left = NULL;
    cur -> right = (Dnode *)malloc(sizeof(Dnode));
    cur->right->c = 'b';
    cur->right->left = cur;
    cur = cur->right;
    travel(head);
    system("pause");
    return 0;
}
void reset(Dnode *h){
    while(h->left)
        h=h->left;
}
void travel(Dnode *head){
    printf("Traversing all nodes of list:\n");
    while(head->right){
        printf("Received char from node %c\n",head->c);
        head = head->right;
    }
    //reset(head);
}
void insert(Dnode * d,char c){
    Dnode *t = d;
    while(t ->right)
        t=t->right;
    t->right = (Dnode *)malloc(sizeof(Dnode));
    if(t->right){
        t->right->c = c;
        t= t->right;
        t->right = t->left = NULL;
    }
}
void unshift(Dnode *d,char cc){
    Dnode *t =(Dnode *)malloc(sizeof(Dnode));
    t =  d->right;
    t->left =NULL;
    d->left = t;
    d = t;
}       

问题是在调用 travel() 之后所有的节点都被打印出来了。 它打印“从节点 a 接收到的字符” 和“从节点 b 接收到的字符”

但是 Windows 给我一个错误,说程序已经崩溃。有什么想法吗?我想要一个详细的答案,以避免将来出现类似的问题。

【问题讨论】:

  • 使用调试器单步调试程序,看看哪里出了问题。
  • 你从未初始化过cur-&gt;right-&gt;right
  • 这看起来不像是一个“简单”的程序。 :-P
  • @kiner_sah 哈哈是真的。

标签: c doubly-linked-list


【解决方案1】:

初始化后,您的列表如下所示:

   head ------>  X  ------> Y ------> uninitialized
               / ^         /
              /  |        /
             /   \       /
     null<---     -------

所以在travel 函数中,您首先在第一个循环中打印X.c,然后在第二个循环中使用未初始化的指针。这会导致程序崩溃。

所以你需要添加:

cur->right->c = 'b';
cur->right->left = cur;
cur->right->right = NULL   // Add this line

到初始化。

还要注意您没有free 分配的资源。所以在main(就在return之前)你应该这样做:

Dnode *tmp;
while(head){
    tmp = head;
    head = head->right;
    free(tmp);
}

顺便说一句 - 不要转换 malloc 返回的值。就做Dnode *cur = malloc(sizeof(Dnode));

顺便说一句 - 这一行:

cur = cur->right;

可以删除,因为cur之后没有使用。

【讨论】:

  • 操作说它是一个双链表而不是树
  • @cssGEEK - 谢谢 - 我对名称感到困惑,即指针被命名为 left 和 right,这对于树来说是正常的,而列表通常使用 prev 和 next。答案已更新。
  • 我在哪里添加它?
  • 如果我不强制转换 malloc,我会收到错误消息。此外,您的代码更新只会打印出“a”。 'b' 永远不会被打印出来
  • @JohnKananakis 你没有说你得到了什么错误,但最常见的原因是使用 C++ 而不是 C。
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多