segmentation fault: 11 in C-code
Warum bekomme ich ein "segmentation fault" mit diesem code?
/* solver.h header file */
10 struct options{
11 unsigned int one:1, two:1, three:1, four:1, five:1, six:1, seven:1, eight:1, nine:1;
12 };
13
14
15 /* structure to describe a cell */
16 struct cell{
17 short value;
18 struct options open_options;
19 };
solver.c:
5 #include <stdio.h>
6 #include "solver.h"
7
8
9
10
11
12 int main(){
13 struct cell board [9][9];
14 int i=0,j=0;
15
16
17 for(i = 1; i<10; i++)
18 for(j = 1; j<10; j++)
19 (board[i][j]).value = j;
20
21 for(i = 1; i<10; i++){
22 for(j = 1; j<10; j++)
23 printf(" %d",(board[i][j]).value);
24 printf("\n");
25 }
26 return 0;
27 }
Ausgabe:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9Segmentation fault: 11
- Sie mit dem Debuggen beginnen können, den code selbst mit
gdb
- Das erste element in einer C-array
x
istx[0]
- In der Tat
for(i=0; i < 9; i++){}
BTW: wenn Sie beabsichtigen, zu implementieren, ein sudoku-solver: Bitmasken werden easyer, weil Sie maskieren können alle zahlen in einem Zug. - ja, ich sehe, dass jetzt. Ich bin noch ziemlich neu in C; ich dachte, dass ein Bitfeld, könnte maskiert werden, ähnlich. aber danke!
- Bitmasken pro Zelle sind nicht so nützlich, wie Bitmasken pro Zeile/Spalte/box. Und vergessen Sie nicht, dass müssen Sie backtrack manchmal (nachdem Sie ausgewählt haben die niedrig hängenden Früchte)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arrays werden indiziert von 0, so dass die Schlaufen sollten
for(i = 0; i<9; i++)
und nichtfor(i = 1; i<10; i++)
In deinem Fall hast du wohl überschreiben Teil des Stapels, aber im Allgemeinen, geht aus Grenzen Ergebnisse zu undefiniertem Verhalten.
some_type array[9];
definiertarray
ein array mit 9 Elementen, wobei die Indizes gehen von 0 bis 8 inklusive. Sie können nichtarray[9]
.board[9][9]
enthalten Elemente mit Indizes im Bereich von 0..8, nicht 1..9. Wenn Sie zugeordnet board[9][was auch immer], Sie tatsächlich überschrieben Speicher, die nicht zu dir gehören, und dies geschah, um das Programm veranlassen, zu explodieren, wenn Sie 0 zurück, übergab die Kontrolle wieder an die C-Laufzeit und es begann zu laufen, seine Strukturen zu führen Herunterfahren.