为什么我的循环只迭代两次?

时间:2017-06-04 16:45:28

标签: c

我定义了两个结构,当我循环设置它们的值时,它只循环两次printf返回。有什么想法吗?

typedef struct {
  int x;
  int y;
  unsigned char status;
} Cell;

typedef struct {
  int sizeX;
  int sizeY;
  Cell cell[];
} World;

int main() {
  int i, x, y;
  i = 0;
  World grid;
  grid.sizeX = 10;
  grid.sizeY = 10;

  for (x = 0; x < grid.sizeX; x++) {
    for (y = 0; y < grid.sizeY; y++) {
      Cell cell;
      cell.x = x;
      cell.y = y;

      printf("%d,%d: ", cell.x, cell.y);

      grid.cell[i] = cell;
      i++;
    }
  }

    return 0;
}

编辑:

下面给出正确答案,感谢您对C菜鸟的评论和耐心!

3 个答案:

答案 0 :(得分:2)

grid.cell[]尚未分配任何内存空间。你应该在开始循环之前通过添加以下行来为它分配一个内存:

 grid.cell = Cell[100];

尺寸100基于grid.sizeX = 10;grid.sizeY = 10;这一事实。无需使用malloc(),因为大小已修复。

如果grid.sizeXgrid.sizeY的尺寸不固定,则应添加以下行而不是grid.cell = Cell[100];

 grid.cell = (Cell*)malloc(sizeof(Cell) *(grid.xSize  * grid.ySize ));

您添加的行World *grid = malloc(sizeof(World) + xSize * ySize * sizeof(Cell));只是一种欺骗方式而且不太清楚。即使它在逻辑上是正确的!!!

答案 1 :(得分:1)

您的World结构体具有灵活的数组成员作为最后一个元素。实际上没有为该成员留出空间。因此,在写入数组时会注销结构的末尾,从而导致未定义的行为。

您需要声明World *并使用malloc为结构和数组分配空间。

World *world = malloc(sizeof(World) + 10 * 10 * sizeof(Cell));

答案 2 :(得分:0)

结果如下:

si = 0