C 数独解算器崩溃和进程返回 -1073741819 (0xC000005)

C Sudoku Solver Crash and Process returned -1073741819 (0xC000005)

我目前正在研究数独求解器,我已经基本完成了,但是正如您从标题中看到的那样,它在开始时崩溃并给我消息:

Process returned -1073741819 (0xC000005)

我在 GNU 编译器中使用代码块。我想我的指针做错了,我只是不知道我做错了什么(目前正在学习 C)。 我真的希望你能帮我解决我的问题。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool finde_leeres_feld(int feld [9][9], int *reihe, int *spalte);

bool ist_legal(int feld [9][9], int reihe, int spalte, int zahl);

bool loese(int feld[9] [9])  //steuert den ablauf der einzelnen funktionen um das sudoku zu lösen
{
    int zahl, spalte, reihe;
    int *pspalte, *preihe;
    pspalte=&spalte;
    preihe=&reihe;

    if (!finde_leeres_feld(feld, preihe, pspalte)) // wenn wir kein leeres feld finden sind wir fertig
        return true;

    for (zahl = 1; zahl <= 9; zahl++)
    {
        if (!ist_legal(feld, reihe, spalte, zahl))
        {
            feld[reihe] [spalte] = zahl; // weist dem feld an der stelle reihe, spalte einen versuchwert zu

            if(feld[reihe] [spalte])
                return true;

            feld[reihe] [spalte] = 0;
        }
    }
    return false;
}

bool finde_leeres_feld(int feld [9] [9], int *reihe, int *spalte) //funktion sucht ein leeres feld und gibt den wert true zurück wenn es eines findet
{

    for((*reihe) = 0; (*reihe) < 9; (*reihe++))
    {
        if(feld [(*reihe)] [(*spalte)] == 0)
             return true;
        return false;
    }
}

bool in_reihe_vorhanden(int feld [9] [9] , int reihe, int zahl) //überprüft ob in der gegebenen reihe eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
    int spalte;
    for (spalte = 0; spalte < 9; spalte++)
        if (feld [reihe] [spalte] == zahl)
            return true;
    return false;
}

bool in_spalte_vorhanden(int feld [9] [9] , int spalte, int zahl) //überprüft ob in der gegebenen spalte eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
    int reihe;
    for (reihe = 0; reihe < 9; reihe++)
        if(feld[reihe] [spalte] == zahl)
            return true;
    return false;
}

bool im_gitter_vorhanden(int feld [9] [9] , int reihenanfang, int spaltenanfang, int zahl) //überprüft ob in dem gegebenen 3x3 gitter eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
    int spalte, reihe;
    for (spalte=0; spalte < 3; spalte++)
        for (reihe=0; reihe < 3; reihe ++)
           if (feld [reihenanfang+reihe] [spaltenanfang+spalte] == zahl)
              return true;
    return false;
}

bool ist_legal(int feld [9] [9], int reihe, int spalte, int zahl ) //überprüft ob es legal wäre in ein bestimmtes feld, welches sich in einem bestimmten gitter befindet, eine zahl einzusetzen
{
    return !in_reihe_vorhanden(feld, reihe, zahl) &&
           !in_spalte_vorhanden(feld, spalte, zahl) &&
           !im_gitter_vorhanden(feld, reihe-reihe%3, spalte-spalte%3, zahl);
}


void printFeld(int feld[9][9])
{
    int spalte, reihe;

    for ( reihe = 0; reihe < 9; reihe++)
    {
       for (spalte = 0; spalte < 9; spalte++)
             printf("%2d", feld[reihe][spalte]);
        printf("\n");
    }
}

int main()
{
    int feld[9][9] = {{3, 0, 6, 5, 0, 8, 4, 0, 0},
                      {5, 2, 0, 0, 0, 0, 0, 0, 0},
                      {0, 8, 7, 0, 0, 0, 0, 3, 1},
                      {0, 0, 3, 0, 1, 0, 0, 8, 0},
                      {9, 0, 0, 8, 6, 3, 0, 0, 5},
                      {0, 5, 0, 0, 9, 0, 6, 0, 0},
                      {1, 3, 0, 0, 0, 0, 2, 5, 0},
                      {0, 0, 0, 0, 0, 0, 0, 7, 4},
                      {0, 0, 5, 2, 0, 6, 3, 0, 0}};
    if (loese(feld) == true)
          printFeld(feld);
    else
         printf("Es gibt keine Lösung");

    return 0;
}
bool loese(int feld[9] [9])
{
        int zahl, spalte, reihe;
        int *pspalte, *preihe;
        pspalte=&spalte;
        preihe=&reihe;

    if (!finde_leeres_feld(feld, preihe, pspalte)) //<<<<<<<<<<
        return true;

您正在将指向未初始化变量 spalte 的指针传递给 finde_leeres_feld,然后在 finde_leeres_feld 中再次取消引用,这会在此处触发未定义的行为 feld [(*reihe)] [(*spalte)] 因为 *spalte 包含垃圾。

你的调试器告诉你这一切。

顺便说一句(与您的问题无关):

你为什么要麻烦那些不需要的指针 pspaltepreihe

 int zahl, spalte, reihe;
        int *pspalte, *preihe;
        pspalte=&spalte;
        preihe=&reihe;

    if (!finde_leeres_feld(feld, preihe, pspalte))

而不是使用 & 运算符直接将指针传递给 spaltereihe

 int zahl, spalte, reihe;

    if (!finde_leeres_feld(feld, &reihe, &spalte))