Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        3年前关闭。
                                                                                            
                
        
我正在尝试从Kernighan的书《在我的工作站上编程的实践》(Windows 7 + vs2015 Community Edition)中获得这段代码

我收到一个奇怪的错误。

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;
        }
    }
}


对于(suf = sp-> suf; suf!= NULL; suf = suf-> next)


  CompareCandCsharp.exe中0x000000013F5C1564的未处理异常:
  0xC0000005:访问冲突读取位置0x0000000000000010。


我的实现类似于此处的描述-Working with arrays and reading text files

似乎算法有效-但在我的计算机上它失败了。我找不到为此的全神贯注的目的。能否请您提出建议。

最佳答案

经过几个小时的调试,我发现预期的方法中有一个小错误。

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


如果在此行之后没有括号,那么方法中的所有其他代码都会尝试多次设置w,这当然会导致内存错误=)。感谢您在阅读问题之前先忽略我的问题=))

10-05 23:34