我正在学校上学,我找到了考试任务: “使用字段创建结构: 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}}
但它不起作用。我该如何创建这样的结构?
答案 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