-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。你能否提出你的建議?
你如何知道'lookup()'返回一個非NULL指針? –
你確定'lookup'返回一個非空指針嗎?如果你在一個調試器中運行,並讓它趕上崩潰(你應該總是這樣做),'sp'的價值是什麼?你確定*崩潰是在'for'循環語句中嗎? –
我不是很酷在C(和Windows在我心中)=(我的基本語言是C#。當然,它可以返回空指針,但基本腳本實現沒有做任何檢查它。因爲調試器會在錯誤發生後立即停留在那裏,也許我會在linux上檢查它=( –