struct fact_entry *fact_table; 是什么意思?意思是?

What does the struct fact_entry *fact_table; mean?

我的任务是完成一段代码,打印来自命令行输入的数字的阶乘。我试图理解代码,但我是 C 编程和结构的新手,所以我不确定 struct fact_entry *fact_table; 的作用是什么?确实而且我不知道如何编程 fact_table 以便使用以下行访问变量:

printf ("%d %lld %s\n", 
    fact_table[i].n, fact_table[i].lli_fact, fact_table[i].str_fact);}

你能帮帮我吗?

#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#define LIMIT 20

struct fact_entry
{                               /* Definition of each table entry */
  int n;
  long long int lli_fact;       /* 64-bit integer */
  char *str_fact;
};

void
panic (char *m)
{
  fprintf (stderr, "%s\n", m);
  exit (0);
}

int
main (int argc, char *argv[])
{
  int n;
  int i;
  struct fact_entry *fact_table;

  if (argc != 2)
    panic ("wrong parameters");

  n = atoi (argv[1]);
  if (n < 0)
    panic ("n too small");
  if (n > LIMIT)
    panic ("n too big");

/* Your code starts here */
  // Allocate memory
  // Compute fact(n) for i=0 to n

  

/* Your code ends here */

  // print computed numbers
  for (i = 0; i <= n; i++)
    {
      printf ("%d %lld %s\n", fact_table[i].n, fact_table[i].lli_fact,
              fact_table[i].str_fact);
    }

/* Your code starts here */
  // Free memory

  

/* Your code ends here */

  return 0;
}

我认为在关注什么是结构时可以最好地回答这个问题。在您的情况下,您可以看到一个结构被定义为

struct fact_entry
{                               /* Definition of each table entry */
  int n;
  long long int lli_fact;       /* 64-bit integer */
  char *str_fact;
};

您可以将结构体视为一组数据。在这种情况下,数据由一个称为 n 的整数、一个称为 lli_fact 的 long long int 和一个称为 str_fact 的字符指针组成。您可以直接或作为指针定义一个新结构。但是,当您将结构定义为指针时,您必须指向 calloc(),即 'free',该结构的内存(否则您将得到 segmentation fault)。 这意味着:

 struct fact_entry fact_table;

或者,作为 pointer/array:

 struct fact_entry *fact_table;

但是,就像我说的,要在后者中不获得 segmentation fault,您需要分配内存。根据定义,您知道一个结构所需的内存将为 sizeof(struct fact_entry)。那么:

fact_table = calloc(n, sizeof(struct fact_entry));

这将为 n 结构分配内存。现在,您可以使用以下方式访问结构的每个字段:

fact_table[i].n = someVal1;
fact_table[i].lli_fact = someVal2;
fact_table[i].str_fact = somePointerToCharacterArray;

以后打印内容可以用:

printf ("%d %lld %s\n", fact_table[i].n, fact_table[i].lli_fact,
          fact_table[i].str_fact);

但是,这只是对什么是结构及其工作原理的简要概述。我没有涵盖任何细节,也没有包括所有细节。有关此主题的更多信息,您可以阅读更多 here.