【问题标题】:Filling 4 variable in a struct type and using malloc在结构类型中填充 4 个变量并使用 malloc
【发布时间】:2010-10-18 23:32:29
【问题描述】:

我需要编写一个简单的程序,要求用户在结构变量数据中插入 4 个双精度类型变量。

   struct Data  
    {
      double a;
      double b;
      double c;
      double average;
    };
struct Data *ptr_name;
int i;

首先,询问用户尺寸:

 printf("Please enter the size:");
 scanf("%d", &size);

然后,使用 malloc。 (不知道怎么用……)

类似的东西...ptr_name = ()malloc();

然后使用for循环从用户那里获取a、b、c。

for(i = 0; i < size; i++)
{
 //dont know how to put the staement..
}

最后,打印所有内容,包括平均值。

for(i = 0; i < size; i++)
    {
     //same as above...
    }

差不多就这些了,我现在正在学习struct type和malloc,浏览网页看不懂...求助,谢谢。

【问题讨论】:

  • 我高度怀疑您应该使用数组而不是结构来保存这些数据。除非你被教导可变长度结构(我对此表示怀疑),否则询问数组的大小比询问结构的大小更有意义。
  • 前一个问题是不断询问变量并将它们存储在结构类型中,直到用户输入 0,0,0 以停止循环。现在我要改问大小,即循环和存储变量的时间。

标签: c pointers struct malloc


【解决方案1】:

malloc 的调用应该是:

ptr_name = malloc (sizeof (struct Data) * size);

以下函数从控制台读取/写入struct Data 的实例:

static struct Data 
read_from_console ()
{
  struct Data d;

  d.a = 0.0f; d.b = 0.0f; d.c = 0.0f; d.average = 0.0f;
  printf ("Enter values separated by comma: (a, b, c): ");
  fflush (stdout);
  if (scanf ("%lf, %lf, %lf", &d.a, &d.b, &d.c) != 3)
    {
      printf ("Invalid input\n");
      exit (1);
    }
  else
    d.average = (double) ((d.a + d.b + d.c) / 3.0f);
  return d;
}

static void
print_to_console (struct Data* d)
{
  printf ("a=%f, b=%f, c=%f, average=%f\n", d->a, d->b, d->c, d->average);
  fflush (stdout);
}

您可以从main 函数内的循环中调用它们:

int
main ()
{
  struct Data *ptr_name;
  int count;
  int i;

  printf ("Please enter size: ");
  fflush (stdout);
  if (scanf ("%d", &count) != 1)
    {
      printf ("Invalid input\n");
      return 1;
    }
  ptr_name = malloc (sizeof (struct Data) * count);

  for (i = 0; i < count; ++i)
    ptr_name[i] = read_from_console ();

  for (i = 0; i < count; ++i)
    print_to_console (&ptr_name[i]);

  return 0;
}

交互示例:

> Please enter size: 2
> Enter values separated by comma: (a, b, c): 12.00, 12.45, 13.00
> Enter values separated by comma: (a, b, c): 5.4, 5.00, 5.1
a=12.000000, b=12.450000, c=13.000000, average=12.483333
a=5.400000, b=5.000000, c=5.100000, average=5.166667

【讨论】:

    【解决方案2】:

    开始
    ptr_name = malloc( size * sizeof( *ptr_name ) );
    

    wikipage on malloc

    【讨论】:

    • 前面有 (int*) 和前面什么都没有有什么区别?
    • () 表示类型转换。它告诉编译器我知道你认为这是 x 类型,但我告诉你把它当作 b
    • @Tim: 将(int *) 放在前面是向你的老板/主管/其他极客/任何人证明你不理解void * 是如何在C 中工作的可靠方式。
    • 应该是size * sizeof(struct Data) 为结构实例分配足够的空间。
    • @Vijay Mathew:可能是,但不是应该。事实上,如果你阅读我链接的维基页面,你会发现:“这个例子中显示了一个有用的 malloc 习惯用法:int *ptr = malloc(10 * sizeof(*ptr)); 也就是说,不是将硬连线类型写入 malloc 的参数,而是使用在要分配的指针内容上的 sizeof 运算符。这样可以确保在修改代码时,分配左侧和右侧的类型永远不会不同步。 @Downvoter:为什么要投反对票?怎么了? (顺便说一句,因为它被标记为“作业”,所以我没有提供完整的答案。)
    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2020-08-20
    • 2022-01-06
    • 1970-01-01
    • 2021-01-19
    • 2018-07-28
    相关资源
    最近更新 更多