web-dev-qa-db-fra.com

défaut de segmentation: 11 en code C

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 9

Erreur de segmentation: 11

9
MRT89

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.

12
MByD

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].

2
Jerry Coffin

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.

1
moonshadow