2013-01-11 57 views
0
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"); 
} 

這是程序的代碼段已被設計爲創建一個雙向鏈表,與B0往裏面... N011 ....(N + 1)1B和字符打印它們。不幸的是,它在回溯時崩潰。爲什麼?在turing_machine.exe在0x771a15de崩潰中橫過回雙向鏈表

未處理的異常:0000005: 訪問衝突閱讀位置0xcdcdcdd5。

+3

哦,實施了圖靈機? :) – 2013-01-11 20:03:38

+0

(但是,這並不能解釋爲什麼你要投射'malloc()'的返回值...) – 2013-01-11 20:04:20

+0

@ H2CO3噓,這是個祕密;) – 0x6B6F77616C74

回答

10

您沒有正確設置pt->prev

而不是

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

嘗試:

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

擊敗我! ;) –

+1

通常我是被毆打的人! :) – Steve

+5

@Steve每個人都是通常被打敗的人。在這種情況下,唯一需要做的就是詛咒和注意。 –