我可以这样使用malloc吗?

时间:2014-04-24 17:20:06

标签: 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");
    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;
}

3 个答案:

答案 0 :(得分:2)

是的,这几乎就是你应该如何使用malloc,除了三件小事和一件大事:

  • 不要将malloc结果投射到C,
  • 使用从0到n-1的索引(包括从1到n的代码)
  • 添加呼叫free(array)以避免内存泄漏。

最重要的是,您不需要malloc来解决此问题:您可以随时计算summin,而无需将单个项目保存到一个数组。

您可以使用此检查替换循环中if的链:

if (i == 0 || array[i] < min) {
    min=array[i];
}

这包括第一个元素的赋值和第一个元素以外的元素的比较。

最后,你可以重写这个

sum=sum+array[i];

作为

sum += array[i];

使用复合赋值运算符。不要忘记将sum初始化为零!

答案 1 :(得分:0)

第22行,需要

if (i=1) 

设为

if (i==1)

现在你将我设为等于1

答案 2 :(得分:0)

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>  /* Defines: ENOMEM */

int main()
   {

添加了rCode以帮助进行错误处理。

   int rCode=0;

删除了未使用的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 *)没有任何内在错误。在某些情况下,这是一个很好的编码实践。 (干得好)。

   array=(int*)malloc(n*sizeof(int));

你应该总是测试你实际上从malloc获得了内存。

   if(NULL == array)
      {
      rCode=ENOMEM;
      fprintf(stderr, "malloc() failed.");
      goto CLEANUP;
      }

数组元素索引的范围为0到(n-1)。开始索引为零,并确保停在(n-1)。

   for(i=0;i<n;i++)
      {
      printf("Give the number %d",i);
      printf("\n");
      scanf("%d",&array[i]);
      }

同样,数组元素索引的范围为0到(n-1)。开始索引为零,并确保停在(n-1)。

   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:

从我早年起,父亲会告诉我:&#39;当你把玩具带到沙箱时,一定要记得在完成后将它们拿走。&#39;

   if(array)
       free(array);

   return(rCode);
   }