9

このコードでセグメンテーション違反が発生するのはなぜですか?

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

ソルバー.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 }

出力:

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

セグメンテーション違反:11

4

3 に答える 3

12

配列は 0 からインデックス付けされるため、ループはそうであるべきでfor(i = 0; i<9; i++)あり、そうではないfor(i = 1; i<10; i++)

あなたの場合、スタックの一部をオーバーライドする可能性がありますが、一般に、境界を超えると未定義の動作が発生します。

于 2012-05-07T17:02:18.740 に答える
2

some_type array[9];array添字が 0 から 8 までの 9 要素の配列であると定義します。使用できませんarray[9]

于 2012-05-07T17:02:43.113 に答える
1

board[9][9]1 ~ 9 ではなく、0 ~ 8 の範囲のインデックスを持つ要素が含まれます。に割り当てたときboard[9][whatever]、実際には自分に属していないメモリを上書きしました。これにより、return 0制御を C ランタイムに戻したときにプログラムが爆発し、その構造を歩いてシャットダウンを実行し始めました。

于 2012-05-07T17:03:12.130 に答える