【发布时间】: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