c程序使用2d数组比较值崩溃

时间:2018-04-23 05:16:55

标签: c arrays

嗨,我的c代码有问题,它一直崩溃没有错误,我不知道为什么。我试图在2d数组内的某个点找到值,例如[1] [1]并查看该值是什么(只有1或0),然后根据它的1或0来处理该值该程序一直没有错误崩溃,我不知道为什么。请帮助

typedef struct gol{ // structure containing a square board
    int **board; // pointer to a pointer
    size_t size; //size_t = unnasigned value
}gol;

使用

在main中创建结构
struct gol *GAME;
GAME = create_gol(30);

如果选择了选项,则使用if菜单选项只会调用 下一个模式功能,但它崩溃

gol* create_gol(size_t size){

    struct gol *Game_Of_Life;
    Game_Of_Life = (struct gol*)malloc(sizeof(struct gol*)); //dynamically create the struct the ptr is pointing to **IMPORTANT
    Gameboard = new int*[size];

    for (int i = 0; i < size; ++i) {
        Gameboard[i] = new int[size];
        // each i-the pointer is now pointing to dynamic array (size 20) of actual int values
    }
    for (int i = 0; i < size; ++i) {   // for each row
        for (int j = 0; j < size; ++j) { // for each column
            Gameboard[i][j] = 0;
        }
    }
    Game_Of_Life->board=Gameboard;
    Game_Of_Life->size=size;

    return Game_Of_Life;
}


void next_pattern(gol* g)
{
    for (int i = 0; i < 20; ++i) {   // for each row
        for (int j = 0; j < 20; ++j) { // for each column
            int sum = neighbour_sum(g,i,j);
            if (g->board[i][j]==1){
                if (sum<2){
                    g->board[i][j]=0;
                }
                if (sum==3 || sum==2 ){
                    g->board[i][j]=1;
                }
                if (sum>3){
                    g->board[i][j]=0;
                }
            }
            if (g->board[i][j]==0 && sum==3){
                g->board[i][j]=1;
            }
        }
    }
}

更新邻居总数,因此它无法超出界限程序仍然崩溃

 int neighbour_sum(gol* g, int i, int j)
 { int sum;
 if ((g->board[(i-1+g->size)%g->size][j])==1){ // left
 sum++;
 }
 if ((g->board[(i-1+g->size)%g->size][(j-1+g->size)%g->size])==1){//left up
 sum++;
  }
  if ((g->board[i][(j-1+g->size)%g->size])==1){ //up
 sum++;
  }
  if ((g->board[(i+1)%g->size][(j+1)%g->size])==1){ //right up
  sum++;
  }
  if ((g->board[i][(j+1)%g->size])==1){ //right
  sum++;
   }
  if ((g->board[(i+1)%g->size][(j+1)]%g->size)==1){//right bottom
   sum++;
  }
  if ((g->board[i][(j+1)%g->size])==1){//bottom
  sum++;
  }
  if ((g->board[(i-1+g->size)%g->size][(j+1)%g->size])==1){// bottom left
   sum++;
  }

  return sum;
   }

2 个答案:

答案 0 :(得分:0)

这些行

for (int i = 0; i < 20; ++i) {   // for each row
    for (int j = 0; j < 20; ++j) { // for each column
        int sum = neighbour_sum(g,i,j);

表示您首先调用neighbour_sum ij为零。 在neighbour_sum内你做:

if ((g->board[(i-1)][j])==1){ // left
               ^^^^

因为ij都是零,实际上是:

if ((g->board[-1][0])==1){ // left
             ^^^^
             ups 

所以你访问数组越界。这可能会导致崩溃。在任何情况下都是非法的。

一般问题似乎是当点位于电路板边缘时您无法处理。

OP发布更多代码后

编辑

这是错误的

Game_Of_Life = (struct gol*)malloc(sizeof(struct gol*));
                                                   ^^^

DO

Game_Of_Life = malloc(sizeof(struct gol));

答案 1 :(得分:0)

我最终找到了解决方案,其中包括i在内的一些问题正在寻找使用

解决的数组之外的值
if ((g->board[(i-1+g->size)%g->size][j])==1){ // left
 sum++;
 }

我也使用c ++语法而不是c语法使用malloc函数解析

Game_Of_Life = (struct gol*)malloc(sizeof(struct gol));

导致崩溃的最后一个问题仍然是函数邻居sum返回-2,因为它没有正确地初始化为

int sum = 0;