更改固定的二维数组以获取在运行时给出的大小

时间:2011-09-28 23:48:58

标签: c multidimensional-array

我一整天都试图绕过这个......

到目前为止,我所使用的代码是计划好的,我的想法是我必须更改tCell * cells[3][5];采用运行时给出的大小。我需要做哪些更改才能保留功能?

typedef struct {
  int active;

} tCell;

typedef struct {
  tCell * cells[3][5];

} tGrid;

// creates a grid and initialize all the cells to NULL
tGrid *init_grid()
{
  tGrid *grid= malloc(sizeof(tGrid));

  if(grid == NULL)
      exit(127); // failed to malloc

  int i, j;
  for(i=0; i < 3; i++)
    for(j=0; j < 5; j++)
      grid->cells[i][j]= NULL;

  return grid;
}

// adds a cell to the grid
void add_cell(tGrid *grid)
{
    tCell cell;

    int y = rand() % 4;

    if(grid->cells[0][y] != NULL)
        exit(127); // cell is taken

    cell.active = 1;
    grid->cells[0][y] = &cell;
}

void remove_cell(tGrid *grid, int x, int y)
{
    if(x < 0 || x > 3 || y < 0 || y > 5)
        exit(127); // out of bounds

    grid->cells[x][y]= NULL;
}

基本上,init_grid必须以xy作为参数:

tGrid *init_grid(int x, int y);

但是,如何更改tGrid结构定义?无论我到目前为止尝试了什么,都会产生编译器错误(例如tCell * cells[][];

在一个稍微相关的说明中,你如何读出“tCell * cells[3][5];”?

注意:

  • 这是一个C问题
  • 我正在使用gcc 4.1来编译代码

1 个答案:

答案 0 :(得分:3)

易。

typedef struct {
  int rows;
  int columns;
  tCell **cells;
} tGrid;

分配:

tGrid *pGrid = (pGrid*)malloc(sizeof(tGrid));
/* check results etc */
pGrid->rows = rows;
pGrid->columns = columns;
pGrid->cells = (tCell**)malloc(sizeof(tCell*)*rows);
/* check results */
do{
    pGrid->cells[rows-1] = (tCell*)malloc(sizeof(tCell)*columns);
    /* check results */
} while (--rows);

完成。

或者,您也可以这样做:

typedef struct {
  int rows;
  int columns;
  tCell *cells;
} tGrid;
/*****whatever in the middle ***********/
pGrid->cells = (tCell*)malloc(sizeof(tCell)*rows*columns);

而不是do-while循环。不同之处在于,在第一种情况下,每一行都将是内存中的一个单独数组,这在处理事物时可能很有用。

当然,最后,每个malloc必须有一个free