gpt4 book ai didi

C - 在带有指针的结构的循环中进行 malloc

转载 作者:行者123 更新时间:2023-11-30 15:28:24 25 4
gpt4 key购买 nike

我是一名初学者,我正在做一些练习来学习 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

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

谢谢!

最佳答案

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

fact_table = malloc(sizeof(struct fact_entry));

只会为一个结构分配内存,以获得指向二维数组的指针

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

现在您已经为二维数组分配了内存;每行都有列。现在要访问二维数组,您可以这样做

fact_table[rowIndex][colIndex].myvar

当使用 Malloc、Realloc、Calloc 等时,您必须自己跟踪数组大小,以便保留行/列的变量。如果您想省略列而只有行数组,请执行以下操作。

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

关于C - 在带有指针的结构的循环中进行 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26596853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com