【发布时间】:2018-06-28 13:10:33
【问题描述】:
我想计算几个数字的阶乘并以数组的形式返回结果。这是我的程序:
#include <stdio.h>
#include <stdlib.h>
int *fact(int arr[], int n) {
int *facts, fac = 1, i, j;
facts = (int *) malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
for (j = 1; j <= *(arr + i); j++)
fac = fac * j;
*(facts + i) = fac;
}
return facts;
}
int main(void) {
int *num, *facto, n, i; //Initializing variables.
printf("How many numbers to calculate factorial for :\t");
scanf("%d", &n);
num = (int*) malloc(n * sizeof(int)); //Dynamic allocation for array num.
printf("Enter the elements separated by spaces :\t");
for (i = 0; i < n; i++)
scanf("%d", num + i);
facto = fact(num, n);
printf("\nFactorials are :\t");
for (i = 0; i < n; i++)
printf("%d\t", *(facto + i));
printf("\n");
return 0;
}
然而,当它打印返回数组的元素时,只有第一个值是正确的。其他的似乎是随机的。
这个程序有什么问题,我该如何解决?
【问题讨论】:
-
仅供参考,对于任何指针或数组
facts和索引i,表达式*(facts + i)恰好等于facts[i]。后者通常更易于阅读和理解,并且还可以节省您编写几个字符的时间。另请阅读Do I cast the result of malloc? -
至于您的问题,请编辑它以显示您的输入、该输入的实际输出以及预期输出。当然,请learn how to debug your programs。
-
OT:当调用任何
scanf()系列函数时,始终检查返回值(而不是参数值)以确保操作成功。 -
OT:当调用任何堆分配函数时:
malloccallocrealloc` 1) 返回类型为void*,可以分配给任何其他指针。强制转换只会使代码混乱,使其更难以理解、调试等。2) 始终检查 (!=NULL) 返回值以确保操作成功
标签: c arrays function pointers dynamic-arrays