2d动态数组结构

时间:2017-06-21 16:30:14

标签: c arrays

我正在学校上学,我找到了考试任务: “使用字段创建结构:  2个整数,  二维柔性阵列(双或浮)“

我做了类似的事情:

    struct my_struct{
     int firstField;
     int secondField;
     int columns;
     int rows;
     double tab[columns][rows];
}

struct my_struct sample = {2, 2, 5, 4, {0.0}}

但它不起作用。我该如何创建这样的结构?

1 个答案:

答案 0 :(得分:1)

struct不能拥有2D VLA 变量逻辑阵列,也不能拥有像成员double tab[columns][rows];那样的2D FAM,灵活数组成员struct可以具有1维FAM的最终结果。

代码可以通过使用double *数组的灵活数组成员来接近OP的“使用字段创建结构:2个整数,二维灵活数组(双精度或浮点数)”的目标。

struct my_struct {
  int columns;
  int rows;
  double *tab[/* row */];
};

这会产生tab,而不是2D数组,而是double *的1D数组。这可以像具有[][]语法的2D数组一样使用。

首先不仅要为my_struct分配内存,还要为附加的double *指针数组分配内存。然后为每个指针为double数组分配内存。

与所有分配一样,很好地测试分配是否成功。使用简单assert(p);

我用一些TBD替换了工作代码,以便获得OP的学习经验。

struct my_struct *my_struct_alloc(int columns, int rows) {
  struct my_struct *p = malloc(sizeof *p + sizeof *(p->tab) * TBD);
  assert(p);
  p->columns = TBD;
  p->rows = TBD;
  for (int r = 0; r < p->rows; r++) {
    p->tab[r] = malloc(sizeof *(p->tab[r]) * TBD);
    assert(p->tab[r]);
    for (int c = 0; c < p->columns; c++) {  // sample, fill array w/illustrative data
      static int count = 0;
      p->tab[r][c] = count++; // Access like a 2D array
    }
  }
  return p;
}

void my_struct_print(struct my_struct *p) {
  for (int r = 0; r < p->rows; r++) {
    for (int c = 0; c < p->columns; c++) {
      printf("%.0f ", p->tab[r][c]);  // Access like a 2D array
    }
    puts("");
  }
}

void my_struct_free(struct my_struct *p) {
  if (p) {
    for (int r = 0; r < p->rows; r++) {
      free(p->tab[r]);
    }
  }
  free(p);
}

int main() {
  struct my_struct *p = my_struct_alloc(2, 3);
  my_struct_print(p);
  my_struct_free(p);
}

输出

0 1 
2 3 
4 5