【问题标题】:Can I use malloc this way?我可以这样使用 malloc 吗?
【发布时间】:2014-06-10 03:15:31
【问题描述】:

我想从动态整数表中找到最小数字和摘要。我不知道为什么没有显示结果。我在 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;
}

【问题讨论】:

  • 也许 'for(i=1;i
  • 两件事:首先don't cast the result of malloc。其次,索引从零开始,以大小减一结束。
  • 另外,你应该将'sum'初始化为零?
  • 注意:查看scanf()的返回值。

标签: c sum malloc min


【解决方案1】:

是的,这几乎就是您应该使用 malloc 的方式,除了三件小事和一件大事:

  • 不要将malloc 转换成C,
  • 使用从零到 n-1(含)的索引(您的代码从 1 到 n,含)
  • 添加调用free(array) 以避免内存泄漏。

重要的是,您不需要malloc 来解决这个问题:您可以随时计算sum 和min,而无需将单个项目保存到数组中。

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

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

这包括第一个元素的分配,以及第一个元素以外的元素的比较。

终于可以重写了

sum=sum+array[i];

作为

sum += array[i];

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

【讨论】:

  • 将min 初始化为INT_MAX 之类的值的优点是min 在printf() 时定义了值n &lt;= 0。
  • @chux 问题在于,当n 为零或更小时,min 确实是未定义的。当输入负数或零 n 时,需要提前退出检查。
  • 感谢您的回答!!!但是如何在不使用 malloc 的情况下从用户那里获取表的大小?
  • @user3403697 与您现在的方式相同 - scanf("%d",&amp;n); 您需要进行的更改是将您拥有的两个循环合并为一个,并将 array[i] 替换为临时的 @987654342 @ 在循环的同一迭代中读取、使用和丢弃的变量。
【解决方案2】:
#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:

从我早年开始,我父亲就告诉我:“当你把玩具带到沙箱时,一定要记得在完成后把它们收起来。”

   if(array)
       free(array);

   return(rCode);
   }

【讨论】:

  • 谢谢!你分析能力很强!我从您的帖子中学到了很多东西,但我认为问题没有解决。
【解决方案3】:

第22行,需要

if (i=1) 

设置为

if (i==1)

现在你设置 i 等于 1

【讨论】:

  • 你说得对,我没看到,我更正了,但问题仍然存在。
  • 我能够用某些数字得到正确的总和,但不是给出的最低数字。所以希望这不是代码问题,只是逻辑问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2020-09-05
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多