このコードでセグメンテーション違反が発生するのはなぜですか?
/* 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 }
出力:
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
配列は0からインデックス付けされるため、ループはfor(i = 0; i<9; i++)
ではなくfor(i = 1; i<10; i++)
である必要があります
あなたの場合、おそらくスタックの一部をオーバーライドしますが、一般に、境界を超えると、未定義の動作が発生します。
some_type array[9];
は、array
を、添え字が0から8までの9要素の配列になるように定義します。 array[9]
は使用できません。
board[9][9]
には、1..9ではなく、0..8の範囲のインデックスを持つ要素が含まれます。 board [9] [whatever]に割り当てたとき、あなたは自分のものではないメモリを実際に上書きしました。これにより、0の制御をCランタイムに戻したときにプログラムが爆発し、その構造をシャットダウンを実行します。