繁体   English   中英

C-带指针结构的循环中的malloc

[英]C - malloc in a loop with struct with pointer

我是一个初学者,我正在做一些练习来学习C。

我正在使用结构和指针进行动态内存分配。 我有这个结构:

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

这是我的主要代码:

    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 */

int p;

      fact_table = (struct fact_entry *)malloc(n*sizeof(struct fact_entry));
      if(fact_table==NULL)
      {
    fprintf(stderr, "Out of memory, exiting\n");
    exit(1);
      }

for (i = 0; i<= n; i++)
    {

      fact_table[i].n = i;

      p = i;
      fact_table[i].lli_fact=1;
      while(p>0)
      {
    fact_table[i].lli_fact = p * fact_table[i].lli_fact;
    p--;
      }

      p = (int)log10(fact_table[i].lli_fact)+1;


     fact_table[i].str_fact = malloc(p);
     if(fact_table->str_fact==NULL)
      {
    fprintf(stderr, "Out of memory, exiting\n");
    exit(1);
      }
      sprintf(fact_table[i].str_fact,"%lld",fact_table[i].lli_fact);
    }


/* Your code ends here */

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

  return 0;
}

这个想法是填充20行的数组。 然后每一行有3列。 第一列显示行号“ i”,第二列显示行号的阶乘,第三列显示第二行,但以字符串格式显示。

我使用log10知道字符串将持续多长时间。

程序的执行显示以下内容:

0 1 |g�!�2�
1 1 1
2 2 2
3 6 6
4 24 24
5 120 120
6 720 720
7 5040 5040
8 40320 40320
9 362880 362880
10 3628800 3628800
11 39916800 39916800
12 479001600 479001600
13 6227020800 6227020800
14 87178291200 87178291200
15 1307674368000 1307674368000
16 20922789888000 20922789888000
17 355687428096000 355687428096000
18 6402373705728000 6402373705728000
19 121645100408832000 121645100408832000
20 2432902008176640000 2432902008176640000

第3行的第0行应显示1,会发生什么情况? malloc似乎有问题。

谢谢!

不确定我是否理解您的问题。

fact_table = malloc(sizeof(struct fact_entry));

只会为一种结构分配内存,以拥有指向您要执行的2d数组的指针

fact_entry **fact_table;
fact_table = malloc(sizeof(struct fact_entry) * RowAmount);
for(int row=0; row < RowAmount; row++)
    fact_table[row] = malloc(sizeof(struct fact_entry) * ColAmount);

现在,您已经为2d数组分配了内存; 每行都有列。 现在访问2D阵列,您可以做

fact_table[rowIndex][colIndex].myvar

使用Malloc,Realloc,Calloc等时,您必须自己跟踪数组大小,因此请保留Rows / Cols的变量。 如果要忽略列,而仅包含一个行数组,请执行以下操作。

fact_entry *fact_table;
fact_table = malloc(sizeof(struct fact_entry) * RowAmount);

现在,您可以通过以下方式访问结构

fact_table[rowIndex].myVar

并且不要忘记释放您的对象

for(int Row=0; Row < RowAmount; Row++)
    free(fact_table[Row]);
free(fact_table);
fact_table = malloc(sizeof(struct fact_entry));

为什么? 在第一种情况下,我只保留一行内存,对吗? 为什么不引起细分错误?

正确。 但是错误的代码并不意味着崩溃。 您将在不希望分配的内存上进行写操作。 但这是你的记忆! 根据实现的不同, malloc可能会分配一个页面大小的内存块。 这可能意味着4096个字节。 仅当您覆盖此设置时,它才会崩溃。 或者,如果您从该页面进行其他分配,则可能会遇到问题。

第二,为什么我可以填写第三栏? 我无法分配内存。我不知道如何引用每一行,因为我在循环中有一个带有指针的结构...而且我也不知道如何在malloc中定义迭代。

不确定我是否遵循。 您可以创建一个malloc一次分配所有内存。 然后手动循环以将str_fact的地址固定到该内存块中。 但这不必要地复杂,尽管这确实意味着您只有一个分配。 @SuperAgenten Johannes提供的答案是通过IMO的正确方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM