【问题标题】:dynamically making an array of structures动态制作结构数组
【发布时间】:2013-09-23 17:55:10
【问题描述】:

如何动态创建结构数组?

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

它成功了,但我不知道到底发生了什么。

【问题讨论】:

  • sizeof(2 * struct arr) 无效。你想要2* sizeof(struct arr)
  • 好消息@mbratch。这也会导致 UB。

标签: c dynamic structure


【解决方案1】:

p[i] 等同于*(p + i)。正在进行取消引用操作。这意味着您不想使用-&gt;。只需使用 . 访问字段:

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

您的解决方案是等效的,但更复杂。 a.b 恰好与 (&amp;a)-&gt;b 相同。

【讨论】:

  • 我认为数组是一个广告,并认为它的实现对我来说是抽象的。
【解决方案2】:

正如@CarlNorum 正确指出的那样,您通过p[i] 取消引用地址p,但随后使用结构成员指针构造。你想要.。并按照我的评论修复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);
}

【讨论】:

    【解决方案3】:

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

    malloc(sizeof(2 * struct arr));
    

    你可能是这个意思:

    malloc(2 * sizeof(struct arr));
    

    我认为原因很容易理解。

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

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

    还有:

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

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2021-10-30
      相关资源
      最近更新 更多