我定义了两个结构,当我循环设置它们的值时,它只循环两次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菜鸟的评论和耐心!
答案 0 :(得分:2)
grid.cell[]
尚未分配任何内存空间。你应该在开始循环之前通过添加以下行来为它分配一个内存:
grid.cell = Cell[100];
尺寸100
基于grid.sizeX = 10;
和grid.sizeY = 10;
这一事实。无需使用malloc()
,因为大小已修复。
如果grid.sizeX
和grid.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