动态制作一组结构

时间:2013-09-18 19:59:41

标签: c dynamic structure

如何动态创建结构数组?

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

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

3 个答案:

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

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

此外,如果pstruct arr*p[i]struct arr,那么您需要.,而不是->来访问其成员:

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

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