2016-07-15 83 views
-1

我試圖讓工作這段代碼從Kernighan的書編程實踐我的工作站上(Windows 7的+ vs2015社區版)馬爾可夫鏈(在Windows的C代碼失敗)

我得到一個奇怪的錯誤。

void generate(int nwords) { 
    State *sp; 
    Suffix *suf; 

    char *prefix[NPREF]; 
    char *w = NULL; 

    int i, nmatch; 

    for (i = 0; i < NPREF; i++) 
     prefix[i] = NONWORD; 

    for (i = 0; i < nwords; i++) { 
     sp = lookup(prefix, 0); 
     nmatch = 0; 

     for (suf = sp->suf; suf != NULL; suf = suf->next) { 
      if (rand() % ++nmatch == 0) { 
       w = suf->word; 
      } 
      if (nmatch == 0) 
       printf("internal error: no suffix %d %s", i, prefix[0]); 
      if (strcmp(w, NONWORD) == 0) 
       break; 

      printf("%s ", w); 

      memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0])); 

      prefix[NPREF - 1] = w; 
     } 
    } 
} 

未處理的異常在0x000000013F5C1564在CompareCandCsharp.exe(SUF = SP->薩夫;薩夫= NULL薩夫= suf->下!): 0000005:訪問衝突讀取位置0x0000000000000010。

我實現類似於這裏描述 - Working with arrays and reading text files

似乎算法的工作 - 但我的電腦上的失敗。我無法爲此找到mindfull porpose。你能否提出你的建議?

+1

你如何知道'lookup()'返回一個非NULL指針? –

+1

你確定'lookup'返回一個非空指針嗎?如果你在一個調試器中運行,並讓它趕上崩潰(你應該總是這樣做),'sp'的價值是什麼?你確定*崩潰是在'for'循環語句中嗎? –

+0

我不是很酷在C(和Windows在我心中)=(我的基本語言是C#。當然,它可以返回空指針,但基本腳本實現沒有做任何檢查它。因爲調試器會在錯誤發生後立即停留在那裏,也許我會在linux上檢查它=( –

回答

0

經過幾個小時的調試,我發現預期方法中存在一個小錯誤。

for (suf = sp->suf; suf != NULL; suf = suf->next) { 
     if (rand() % ++nmatch == 0) { 
      w = suf->word; 
     } 

沒有括號如果此行,在方法中的所有其他代碼嘗試集合W多次後,當然它會導致內存錯誤=)。 Thanx在閱讀它之前用於否定我的問題=))