我可以这样使用malloc吗?
我想从动态整数表中找到最小的数字和摘要。我不知道为什么没有显示结果。我在malloc上做错什么了吗?我也可以用realloc吗我可以这样使用malloc吗?,c,sum,malloc,min,C,Sum,Malloc,Min,我想从动态整数表中找到最小的数字和摘要。我不知道为什么没有显示结果。我在malloc上做错什么了吗?我也可以用realloc吗 #include <stdlib.h> #include <stdio.h> int main() { int n,i,min,sum,xronos; int* array; printf("Give me how many numbers does the table will have: \n"); scan
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n,i,min,sum,xronos;
int* array;
printf("Give me how many numbers does the table will have: \n");
scanf("%d",&n);
array=(int*)malloc(n*sizeof(int));
for(i=1;i<=n;i++)
{
printf("Give the number %d",i);
printf("\n");
scanf("%d",&array[i]);
}
for(i=1;i<=n;i++)
{
sum=sum+array[i];
if (i=1)
{
min=array[i];
}
else
{
if (array[i]<min)
{
min=array[i];
}
}
}
printf("%d",sum);
printf("\n The answer is :",(n-2)*min+(sum-min));
getch();
return 0;
}
#包括
#包括
int main()
{
int n,i,min,sum,xronos;
int*数组;
printf(“告诉我该表有多少个数字:\n”);
scanf(“%d”和“&n”);
数组=(int*)malloc(n*sizeof(int));
对于(i=1;i是的,这几乎就是您应该如何使用malloc
,除了三件小事和一件大事之外:
- 不要将
malloc
结果转换为C
- 使用从0到n-1(包括)的索引(代码从1到n,包括)
- 添加调用
空闲(数组)
以避免内存泄漏
重要的是,您不需要malloc
来解决这个问题:您可以一边计算sum
和min
,而无需将单个项保存到数组中
如果循环中有
s,则可以使用此检查替换链:
if (i == 0 || array[i] < min) {
min=array[i];
}
作为
使用复合赋值运算符。不要忘记将总和初始化为零!第22行,需要
if (i=1)
着手
if (i==1)
现在你把i设为1
#include <stdlib.h>
#include <stdio.h>
#include <errno.h> /* Defines: ENOMEM */
int main()
{
已删除xronos,因为它未被使用
int n,i,min;
初始化总和为0
int sum=0;
将数组指针初始化为NULL,以便更容易清理。
int*array=NULL
printf("Give me how many numbers does the table will have: \n");
scanf("%d",&n);
将malloc的输出转换为(int*)本身并没有什么错误。在某些情况下,这是一种很好的编码实践。(干得好)
您应该始终测试您是否确实从malloc获得了内存
if(NULL == array)
{
rCode=ENOMEM;
fprintf(stderr, "malloc() failed.");
goto CLEANUP;
}
数组元素索引在0到(n-1)的范围内。从零开始索引,并确保在(n-1)停止
也许是因为(i=1;它有两件事:第一。第二,索引开始于零,结束于大小减1。另外,您应该将“sum”初始化为零?注意:检查scanf()的返回值
。你是对的,我没有看到,我纠正了它,但问题仍然存在。我能够用某些数字得到正确的和,但不是给定的最低数字。因此,希望这不是代码问题,只是逻辑问题。将min
初始化为INT\u MAX
这样的值具有min
有定义的优点printf()处的ed值
时间应该n@chux问题是当n
为零或更小时,min
实际上是未定义的。当输入负值或零n
时,需要提前进行检查。谢谢您的回答!!!但是我如何不使用malloc从用户那里获得表的大小呢?@user3403697与您现在使用的方法相同-scanf(“%d”,&n);
您需要做的更改是将您拥有的两个循环组合在一个循环中,并替换array[i]
使用一个临时int
变量,您可以在循环的同一次迭代中读取、使用和丢弃该变量。谢谢!您非常善于分析!我从您的帖子中学到了很多东西,但我认为问题没有解决。
int sum=0;
printf("Give me how many numbers does the table will have: \n");
scanf("%d",&n);
array=(int*)malloc(n*sizeof(int));
if(NULL == array)
{
rCode=ENOMEM;
fprintf(stderr, "malloc() failed.");
goto CLEANUP;
}
for(i=0;i<n;i++)
{
printf("Give the number %d",i);
printf("\n");
scanf("%d",&array[i]);
}
for(i=0;i<n;i++)
{
sum=sum+array[i];
if(1 == i)
min=array[i];
else
{
if(array[i] < min)
min=array[i];
}
}
printf("%d",sum);
printf("\n The answer is :",(n-2)*min+(sum-min));
getch();
CLEANUP:
if(array)
free(array);
return(rCode);
}