構造

2016-05-15 4 views
-1

を印刷し、私は自分の端末上で数独を印刷したいと私は、この構造を得た:構造

#define SUDOKU_SIZE 9 
typedef struct { 
    int grid[SUDOKU_SIZE][SUDOKU_SIZE]; 
} sudoku_t; 

をそして、私は私のメイン機能でこれを得た:コンパイル中にも問題はありません

int main(int argc, char const *argv[]){ 
    sudoku_t *s; 
    s->grid[0][0]=6;//manualy setting the value of the sudoku 
    ... 
    s->grid[8][8]=7; 
    int k, l; 
    printf("\n"); 
    for(k=0;k<SUDOKU_SIZE;k++){ 
     for(l=0;l<SUDOKU_SIZE;l++){ 
      int a=s->grid[k][l]; 
      printf("%d", a); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
    return 0; 
} 

実行中に「セグメンテーションフォルト(コアダンプ)」エラーが発生しました。 * ./ingis `でエラーが発生しました::無料()

[EDIT] [OK]を、私はmalloc関数を使用して、私の機能、 の時に自由に使用されるが、私はまだエラーが出るありがとう:無効な次のサイズ(速い):0x0000000001e8d010 * 中止(コアダンプ)

ここ

が更新されたコードです:ここで定義後

int main(int argc, char const *argv[]){ 
    sudoku_t *s=(sudoku_t*)malloc(sizeof s); 
    if(NULL==s){ 
     perror("malloc() failed"); 
     exit(EXIT_FAILURE); 
    } 
    int k, l; 
    printf("\n"); 
    for(k=0;k<SUDOKU_SIZE;k++){ 
     for(l=0;l<SUDOKU_SIZE;l++){ 
      int a=s->grid[k][l]; 
      printf("%d ", a); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
    free(s); 
    return EXIT_SUCCESS; 
} 
+1

よう->オペレータの.演算子を使用してそれを宣言あなたは 's-> grid [0] [6]'を割り当てる前に 's'のためのメモリを使います。 – Evert

+0

コアダンプの前にテキストが出力されましたか? –

+0

structへのポインタをポインタ変数に変更してください: 'sudoku_t s;'、あなたはうまくいくはずです。 – Evert

答えて

1
sudoku_t *s; 

sはどこも指していません。

だからここ

s->grid[0][0]= ... 

のようにそれを逆参照すると、無効なメモリを読み取ろうとし、これと未定義の動作を起動します。この瞬間から何かが起こる可能性があります。

soduko_t s; 

.によってすべて-> -operatorsを置き換える:ちょうど行って、それへの単なるポインタsoduko_tとないの定義この問題を解決するには

別の方法としては、コードがsを使用して行われた後

soduko_t * ps = malloc(sizeof *ps); 
if (NULL == ps) 
{ 
    perror("malloc() failed"); 
    exit(EXIT_FAILURE); 
} 

をやって動的にメモリを割り当てるメモリを解放することができます:

free(ps); 
+0

私はfree()コールを作成すると、エラーが発生します:free():無効な次のサイズ(高速):0x000000000217f010 ** * 異常終了(コアダンプされた) – Cariamole

+0

@カリアモレ:更新されたコードを答えの一番下に追加するだけで、それを見ることができます。 – alk

+0

@Cariamole:エラー、 'malloc()'を使って割り当てた場合は、解放する必要があります。 'sudoku_t sをしないでください。 ....無料(s); ' – alk

1

あなたは構造体にメモリを割り当てる必要があります。

int main(int argc, char const *argv[]){ 
    sudoku_t *s = malloc(sizeof *s); 
    s->grid[0][0]=6; 
    // continue... 
} 
1

代わりのsudoku_t *s;のようなポインタだけで通常の変数sudoku_t s;

そして今だけではなく、あなたがいずれかを割り当てない

s.grid[0][0] = 6; 
... 
s.grid[8][8] = 9; 
... 
int a = s.grid[k][l];