1

私はCでマインスイーパゲームを書いています。データを説明するためにこのような構造を作成した、さまざまなサイズと数の地雷原でさまざまな地雷原でゲームをプレイできるようにしたいと考えています。

typedef struct t_Place Place;

struct t_Place{
    unsigned numberOfMinesNear;
    int mine;
    int state;
};

typedef struct t_Minefield Minefield;

struct t_Minefield{
    int xSize;
    int ySize;
    unsigned minesNumber;
    Place **places; 
};

だから、今私は自分の地雷原を初期化しようとしています。私は次のことをします:

void makeGame(Minefield *minefield, unsigned x, unsigned y, unsigned mines){
    int i, j;  
minefield->places = malloc(x * y * sizeof(Place));       
    for(i = 0; i < x; i++)
        for(j = 0; j < y; j++){
            minefield->places[i][j].mine = EMPTY;
            minefield->places[i][j].state = HIDDEN;
            minefield->places[i][j].numberOfMinesNear = 0;
        }

minefield->xSize = x;
    minefield->ySize = y;

    unsigned minesToPlace = mines;
    srand(time(NULL));
    while(minesToPlace > 0){
        i = rand() % x;
        j = rand() % y;

        if(minefield->places[i][j].mine)
            continue;

        minefield->places[i][j].mine = MINE;
        minesToPlace--;      
    }  
    minefield->minesNumber = mines;
    // here will be call of play(minefield) function to start the game
}

int main(){
    Minefield *gameField = (Minefield *) malloc(sizeof(Minefield));

    makeGame(gameField, DEFAULT_X, DEFAULT_Y, DEFAULT_MINES);

    // DEFAULT_X = DEFAULT_Y = DEFAULT_MINES =  10

    free(gameField);
    return 0;
}

makeGame関数のコードの最初の行でセグメンテーション違反が発生しています。私が間違っているのは何ですか?地雷原に静的ではなく動的にメモリを割り当てたい。

4

2 に答える 2

2
minefield->places = malloc(x * y * sizeof(Place)); 

上記のメモリ割り当てが問題の原因である可能性があり、2つ星のポインタであるため、2つの呼び出しplacesが必要です。1つは行番号ポインタを割り当てるため、もう1つはタイプのポインタの列番号を割り当てるためです。malloc()**placemalloc()*placeplace

これは、構造内に含まれる2つ星のポインターを割り当て/初期化するSSCCEです。

#include <stdio.h>
#include <stdlib.h>

#define ROW_SZ 5
#define COL_SZ 25

typedef struct demo{
char **str;
}demo;


int main()
{

demo *d = malloc( sizeof(demo) );

d->str = malloc(ROW_SZ * sizeof(char*) );             //d->str is assigned char**
  for ( i = 0; i < ROW_SZ; i++ )
        d->str[i] = malloc(COL_SZ * sizeof(char) );   //d-str[i] is assigned char*

// code here to use d->str[ROW_SZ][COL_SZ]

for ( i = 0; i < ROW_SZ; i++ )
  free(d->str[i]);


free(d->str);
free(d);

return 0;
}
于 2013-03-15T18:10:40.913 に答える
1

これは、通常、割り当てられた 2D 配列を次のように表示する方法です。

minefield->places = malloc(x * sizeof(Place *));       

for(i = 0; i < x; i++)
{
    minefield->places[i] = malloc(x * sizeof(Place));
}

これを試して、セグメンテーション違反がなくなるかどうかを確認してください。

于 2013-03-15T18:16:10.883 に答える