Pourquoi ai-je un problème de segmentation avec ce 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 }
production:
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 9Erreur de segmentation: 11
Les tableaux sont indexés à partir de 0, les boucles doivent donc être for(i = 0; i<9; i++)
et non for(i = 1; i<10; i++)
Dans votre cas, vous remplacez probablement une partie de la pile, mais en général, sortir des limites entraîne un comportement indéfini.
some_type array[9];
définit array
comme un tableau de 9 éléments, avec des indices allant de 0 à 8 inclus. Vous ne pouvez pas utiliser array[9]
.
board[9][9]
contiendra des éléments dont les indices sont compris entre 0..8 et non 1..9. Lorsque vous avez affecté à la carte [9] [peu importe], vous avez en fait écrasé la mémoire qui ne vous appartenait pas, et cela s'est avéré justement faire exploser le programme lorsque le retour 0 a remis le contrôle au runtime C et il a commencé à parcourir ses structures vers effectuer l'arrêt.