疾病模拟器上的Segfault

时间:2014-09-29 17:05:50

标签: c segmentation-fault

我正在尝试用C编程疾病模拟器。出于某种原因,在while(1)循环的大约20-25次迭代之后,它会出现段错误。这是完全随机的。我一直试图解决这个问题几个小时,所以任何帮助都会非常感激。

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

typedef struct space {
int type;
int x, y;
} space_t;

space_t space[40][40];



int main(){

bool infected = false;
int i = 0;
int x = 0;
int y = 0;

srand(time(NULL));

while(i < 1600){
    space[x][y].x = x;
    space[x][y].y = y;
    if(rand() % 9 == 0 && !infected){
        space[x][y].type = 1;
        infected = true;
    }
    if(rand() % 20 == 8){
        space[x][y].type = 2;
    }

    x++;
    i++;
    if(x == 40){
        x = 0;
        y++;
    }
}

system("clear");

int count;
int inf = 0;

while(1){

x = 0;
y = 0;
i = 0;

    while(i < 1600){
        if(space[x][y].type == 1){
            inf++;
        }
        if(space[x][y].type == 1 && rand() % 9 > 4){
            if(rand() % 9 > 4){
                space[x+(rand() % 3)][y].type = 1;
            } else {
                space[x+(-(rand() % 3))][y].type = 1;
            }
        } else if(space[x][y].type == 1 && rand() & 9 > 4){
            if(rand() % 9 > 4){
                space[x][y+(rand() % 3)].type = 1;
            } else {
                space[x][y+(-(rand() % 3))].type = 1;
            }
        }
        if(space[x][y].type == 1){
            printf("[I]");
        } else if(space[x][y].type == 2){
            printf("[D]");
        } else printf("[ ]");
        x++;
        i++;
        if(x == 40){
            printf("\n");
            x = 0;
            y++;
        }
    }
    count++;
    printf("%d\n", count);
    printf("%d\n", inf);
sleep(1);
system("clear");
}

return 0;
}

1 个答案:

答案 0 :(得分:1)

代码为索引生成随机偏移,但不保证在适当的范围内。

if(space[x][y].type == 1 && rand() % 9 > 4){
    if(rand() % 9 > 4){
        // Nothing forces `x+(rand() % 3)` in legal index range.
        space[x+(rand() % 3)][y].type = 1;  
    } else {
        space[x+(-(rand() % 3))][y].type = 1;
    } 
}

相反

if(space[x][y].type == 1 && rand() % 9 > 4) {
    int r = rand();
    if(r % 9 > 4) {
      int offset = x + r%3;
      if (offset < 40)  space[offset][y].type = 1;  
    } else {
      int offset = x - r%3;
      if (offset >= 0)  space[offset][y].type = 1;
    } 
}
...  // similar change for next block

注意:稍后在代码中,当然rand() & 9应为rand() % 9(%not&amp;)。