0

如何动态创建结构数组?

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);

它有效,但我不知道到底发生了什么。

4

3 回答 3

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.

于 2013-09-18T20:02:17.453 回答
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);
}
于 2013-09-18T20:08:46.473 回答
1

以下表达式是可疑的,很可能是无效的:

malloc(sizeof(2 * struct arr));

你可能是这个意思:

malloc(2 * sizeof(struct arr));

我认为很容易理解为什么。

另外, if pis a struct arr*, p[i]is a struct arr,所以你需要 a .,而不是 a->来访问它的成员:

scanf("%d %f", &(p[i].a), &(p[i].b));

和:

printf(("%d %f", p[i].a, p[i].b);
于 2013-09-18T20:08:47.787 回答