【问题标题】:Max number in array数组中的最大数量
【发布时间】:2014-02-11 22:27:20
【问题描述】:

我知道这个有很多解决方案,但是环顾四周后,我没有找到任何涉及指针的解决方案

现在它一直在抛出警告,根本没有输出,我做错了什么?

#include <stdio.h>

int findbig (int a[], int n)
{
    int max = a[0];

    for (int i = 1; i < n; i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }

    return max;
}



int main (void)
{

int n;

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

int a[n];

printf("Now enter those %d numbers: \n", n);

    for (int i = 1; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

int biggest = findbig (a[n], n);

printf("The biggest number is: %d\n", biggest);

return 0;
}

我的编译器抱怨:

-警告:传递 'findbig' 的参数 1 使指针从整数不进行强制转换 [默认启用]

-注意:预期为“int *”,但参数的类型为“int”

【问题讨论】:

  • for (int i = 1; i &lt; n; i++) --> for (int i = 0; i &lt; n; i++)

标签: c arrays pointers for-loop


【解决方案1】:

a[n](及其等效的*(a + n) 形式)是一个 int,而不是指向 int 的指针。它也超出了数组的边界。您需要将警告转化为错误。你传递了一个 int,它的 value 被转换为一个指针(地址),这不好。

你需要像这样调用你的函数:

findbig(a, n);

无论您的签名如何,findbig 都会收到一个指向 int 的指针。您不能将数组传递给 C 中的函数(或从函数返回)。它们降级为指向其第一个元素的指针。


附带说明,填充数组时您总是跳过第一个元素,因此用户说“我想输入 N 个数字”,但您只允许他们输入 n-1。当您使用 a[0] 作为您的初始 max 编号时,这也是有问题的,但该元素的值是不确定的。

它可以是任何东西,即某个巨大的数字,然后你的函数会给出奇怪的结果。将数组初始化为 0 (int a[n] = {0};) 或从 0 开始循环(更好)。

【讨论】:

  • 我尝试修复它,但现在它给了我随机的乱码,我认为这是值的地址。我试图取消引用它但无济于事:多少个数字? 5 现在输入这 5 个数字:1 6 2 3 1 最大的数字是:2686652
  • @user3109599:不,问题在于您如何填充数组(不填充第一个元素)。在您发表评论时,我使用该信息编辑了我的回复。
【解决方案2】:

通过索引a,做a[n],你得到数组a在第n个索引中的值,它是int type。您需要使用数组“指针”变量调用findbig(....); 函数,而不对其进行索引,方法是:

findbig(a, n);

【讨论】:

    【解决方案3】:

    这一行是错误的。

    int a[n]
    

    数组应该用常数值初始化,因为数组的空间是在程序执行之前分配的。因此,变量将不起作用。

    【讨论】:

    • 错了。 C99 允许 VLA(可变长度数组),如果这是问题所在,他的程序甚至无法编译。
    • 抱歉我的错误,但由于这个问题,我无法在我的 VS 上编译它。
    • 因为 VS 已经过时了(C89,2013 年还有一些 C99 的东西)。您使用的是非常旧的 C 编译器(或不允许使用 VLA 的 C++ 编译器)。
    猜你喜欢
    • 2010-11-26
    • 2020-09-01
    • 2018-09-22
    • 2012-11-09
    • 2017-10-20
    • 2014-09-14
    • 2022-01-02
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多