浮点指针malloc数组接收到数组

时间:2017-12-11 01:38:39

标签: c arrays malloc

我正在编写一个代码,要求我使用malloc函数,将输入提供给数组,确定并打印平均值以及每个数组值与平均值的关系。这是我的代码

#include <stdio.h>
#include <stdlib.h>

int main (){
  int i, n;
  float* numbers;
  float sum, average;
  sum = 0;
  printf("How many numbers? ");
  scanf("%d", &n);
  numbers = (int*)malloc(n * sizeof(int));
  printf("Enter %d decimal numbers\n", n);

for(i = 0; i < n; i++)
{

    scanf("%f", &numbers[i]);
    printf("%f\n", &numbers[i]);
    sum = sum + numbers[i];
}

printf("%f\n", &sum);
 average = sum / n;
 printf("The average was %f\n", &average);
 for(i = 0; i < n; i++)
    {
    if (numbers[i] < average)
        printf("%f is less than the average\n" , &average);
    else if (numbers[i] > average)
        printf("%f is less than the average\n" , &average);
    else
        printf("%f is average\n" , &average);
    }
    return 0;
}

在我用来检查我的数组是否正确接收输入的第一个for循环中的print语句,它不是,如我的输出所示,在下面,我的问题是为什么我的数组不是收到价值?

How many numbers? 4
Enter 4 decimal numbers
4
0.000000
4
0.000000
4
0.000000
4
0.000000
0.000000
The average was 0.000000
0.000000 is average
0.000000 is average
0.000000 is average
0.000000 is average

4 个答案:

答案 0 :(得分:3)

一些纠正的问题:

1)

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

int的内存分配已替换为float.的分配 不需要演员。

numbers = malloc(n * sizeof(float));

2)

 printf("%f\n", &numbers[i]);

目的不是打印指向number[i]的指针,而是number[i]本身。

printf("%f\n", numbers[i]);

此类问题已针对其他一些打印位置进行了更正。

3)最终打印已更正,逻辑程序需要打印numbers[i]而不是average

if (numbers[i] < average)
        printf("%f is less than the average\n" , numbers[i] );
    else if (numbers[i] > average)
        printf("%f is more than the average\n" , numbers[i] );

更正程序:

#include <stdio.h>
#include <stdlib.h>

int main (){
  int i,n;

  float* numbers;
  float sum, average;
  sum = 0;

  printf("How many numbers? ");
  scanf("%d", &n);

  numbers = malloc(n * sizeof(float));

  printf("Enter %d decimal numbers:\n", n);

  for(i = 0; i < n; i++)
  {
    scanf("%f", &numbers[i]);

    printf("%f\n", numbers[i]);

    sum = sum + numbers[i];
  }

  printf("%f\n", sum);

  average = sum / n;
  printf("The average was %f\n", average);

  for(i = 0; i < n; i++)
  {
    if (numbers[i] < average)
        printf("%f is less than the average\n" , numbers[i] );
    else if (numbers[i] > average)
        printf("%f is more than the average\n" , numbers[i] );
    else
        printf("%f is average\n" , average);
  }

  return 0;
}   

输出:

How many numbers? Enter 4 decimal numbers:
2
10
5
8
2.000000
10.000000
5.000000
8.000000
25.000000
The average was 6.250000
2.000000 is less than the average
10.000000 is more than the average
5.000000 is less than the average
8.000000 is more than the average

答案 1 :(得分:1)

问题在于:

printf("%f\n", &numbers[i]);

您正在打印对numbers[i]的引用,而不是值本身。尝试:

printf("%f\n", numbers[i]);

您打印值的所有其他地方也是如此(即sumaverage)。打印时你得到的是0,因为当你指向其中一个值并将其转换为浮点值时,它会将其解释为零。

也许其他人能够启发我们确切的原因(即我不确定这是否是未定义的行为)。

如果你仍然感到困惑:你必须将引用(&)传递给scanf的值,然后将值本身传递给printf,这就是原因:对于scanf,你告诉它“请从控制台获取一个浮点数并将其放在我指定的位置(即&numbers[i])”。当您致电printf时,您告诉它“请打印我给您的价值(即numbers[i])”。

答案 2 :(得分:1)

和= 0F; 写f使其被解释为浮点常数而不是双精度。这并不重要,但这是很好的做法,可以帮助解决很多问题。

numbers =(float *)malloc(n * sizeof(float)); 因为你想要一个float数组而不是一个整数数组。

的printf(&#34;%F \ n&#34;,数字[1]); 使用&#39;&amp;&#39;仅当您要访问变量的地址时。要访问存储在变量中的值,只需使用变量名称。

printf(&#34; Sum为:%f \ n&#34;,sum); 在输出中编写正确的消息很重要。

for(i = 0; i&lt; n; i ++){if(numbers [i]&lt; average)printf(&#34;%f小于平均值\ n&#34;,numbers [i] );否则if(numbers [i]&gt; average)printf(&#34;%f小于平均值\ n&#34;,numbers [i]); else printf(&#34;%f是平均值\ n&#34;,numbers [i]); }

您需要打印数字[i]的值而不是平均值。

请记住不要使用&amp;在printf中,除非你想打印一个地址

答案 3 :(得分:0)

首先修复malloc

numbers = malloc(n * sizeof(float)); // Not 'int'

然后修复 for 和下一个printf

printf("%f\n", numbers[i]); // printf wants a value not an address

printf("%f\n", sum);        // same

然后

printf("The average was %f\n", average); // same

和3下一个类似的printf。