【问题标题】:Crash traversing back doubly linked list遍历双向链表时崩溃
【发布时间】:2013-01-11 20:00:38
【问题描述】:
typedef struct tape
{
    char symbol;
    struct tape *next;
    struct tape *prev;
}tape;

tape *pt;    

void GenerateInputTape(int n)
{
    int i;

    pt=(tape*)malloc(sizeof(tape));

    pt->symbol='B';

    pt->prev=NULL;
    pt->next=(tape*)malloc(sizeof(tape));
    pt=pt->next;

    for(i=0;i<2*(n+1);i++)
    {   
        if(i < (2*n/2))
            pt->symbol='0';
        else
            pt->symbol='1';

        pt->prev=pt;
        pt->next=(tape*)malloc(sizeof(tape));
        pt=pt->next;
    }

    pt->symbol='B';

    pt->next=NULL;
}

void ShowTape()
{
    //Move tape to the beginning
    while (pt->prev != NULL)
        pt=pt->prev; //crash point

    //List out all of the elements
    while ((pt->next) != NULL)
    {   
        printf("%c",pt->symbol);
        pt=pt->next;
    }
    puts("\n");
}

这是一个程序的代码 sn-p,旨在创建一个双向链表,用 B0...n011....(n+1)1B 个字符填充它并打印它们。不幸的是,它在返回时崩溃了。为什么?

turing_machine.exe 中 0x771a15de 处未处理的异常:0xC0000005: 访问冲突读取位置0xcdcdcdd5。

【问题讨论】:

  • 哦,实现图灵机? :)
  • (但是,这并不能解释为什么要转换 malloc()... 的返回值)
  • 我认为你应该在那里s/don't//,如果你使用 C 编译器,你不需要强制转换,如果你使用 C++ 编译器,你需要。
  • @Steve 好吧,开导你:it's even doscouraged :)
  • 谢谢 :) 我生活在一个 C++ 世界中,我从不使用 malloc 并尽可能避免使用 new :)

标签: c linked-list doubly-linked-list


【解决方案1】:

你没有正确设置pt-&gt;prev

代替

pt->prev=pt;
pt->next=(tape*)malloc(sizeof(tape));

尝试:

pt->next = malloc(sizeof(tape));
pt->next->prev = pt;

【讨论】:

  • 通常我是被它打败的人! :)
  • @Steve 每个人通常都是被打败的人。在这种情况下,唯一要做的就是诅咒和投票。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
相关资源
最近更新 更多