如何动态创建结构数组?
struct arr
{
int a;
float b;
} *p;
p = (struct arr *)malloc(2*sizeof(struct arr));
for (i = 0; i < 2; i++)
{
scanf("%d %f", &p[i]->a, &p[i]->b);
}
for (i = 0; i < 2; i++)
{
printf("%d %f", p[i]->a, p[i]->b);
}
此代码无效并产生错误。我编辑了scanf到这个,
scanf("%d %f",&(&p[i])->a,&(&p[i])->b);
和printf到此,
printf(("%d %f",(&p[i])->a,(&p[i])->b);
它有效,但我不知道到底发生了什么。
答案 0 :(得分:3)
p[i]
相当于*(p + i)
。有一个解除引用操作正在进行。这意味着您不想使用->
。只需使用.
即可访问字段:
scanf("%d %f", &p[i].a, &p[i].b);
printf("%d %f",p[i].a, p[i].b);
您的解决方案是等效的,但更复杂。 a.b
恰好与(&a)->b
相同。
答案 1 :(得分:1)
正如@CarlNorum正确指出的那样,您通过p
取消引用地址p[i]
,然后使用结构成员指针构造。你想要.
。并按照我的评论修正sizeof
:
struct arr
{
int a;
float b;
} *p;
int i;
p = malloc(2*sizeof(struct arr));
for (i = 0; i < 2; i++)
{
scanf("%d %f", &p[i].a, &p[i].b);
}
for (i = 0; i < 2; i++)
{
printf("%d %f\n", p[i].a, p[i].b);
}
答案 2 :(得分:1)
以下表达式可疑,很可能无效:
malloc(sizeof(2 * struct arr));
你的意思可能是:
malloc(2 * sizeof(struct arr));
我认为很容易理解为什么。
此外,如果p
是struct arr*
,p[i]
是struct arr
,那么您需要.
,而不是->
来访问其成员:
scanf("%d %f", &(p[i].a), &(p[i].b));
和
printf(("%d %f", p[i].a, p[i].b);