C 产生荒谬的输出

C 产生荒谬的输出,c,io,printf,output,C,Io,Printf,Output,我编写了以下代码,但它生成了荒谬的输出值。我想不出代码中出了什么问题 #include <stdio.h> int main(void) { int t, n, i, count; scanf("%d", &t); while(t--) { scanf("%d", &n); long long a[n], limit; for(i = 1; i <= n; i++)

我编写了以下代码,但它生成了荒谬的输出值。我想不出代码中出了什么问题

#include <stdio.h>

int main(void)
{
    int t, n, i, count;
    scanf("%d", &t);

    while(t--)
    {
        scanf("%d", &n);
        long long a[n], limit;

        for(i = 1; i <= n; i++)
            scanf("%lld", &a[i]);

        count = 1;
        limit = a[1];
        for(i = 2; i <= n; i++)
        {
            if(a[i] < limit)
            {
                count++;
                limit = a[i];
            }
        }

        printf("%lld\n", count);
    }

    return 0;
}
输入:-

三, 1. 10 3. 8 3 6 5. 4 5 1 2 3

输出:-

-4621320042389176319 4615368115365085186 -462132033446952446


请解释我的代码有什么问题。

您在这里使用了错误的长度修饰符:

 printf("%lld\n", count);
这样做会调用未定义的行为,因此可以打印任何内容—任何事情都可能发生

要打印计数为d的整数,不使用任何长度修饰符

 printf("%d\n", count);

或者将count定义为long-long int,这是lld所期望的。

至少有两个问题: 首先,在C中,数组索引以0开始,而不是1。一定是这样

    for(i = 0; i < n; i++)
        scanf("%lld", &a[i]);

    count = 1;
    limit = a[0];
    for(i = 1; i < n; i++)
    {
        if(a[i] < limit)
        {
            count++;
            limit = a[i];
        }
    }

第二,调用printf%lld\n,count;但是count是一个“普通int”,所以它应该是printf%d\n,count

我无法复制垃圾输出,但我在代码中看到了两次UB,这是由于访问a数组超出范围造成的:

for(i = 1; i <= n; i++)
   scanf("%lld", &a[i]);
……还有

for(i = 2; i <= n; i++)
{         
    if(a[i] < limit)
    {
            count++;
            limit = a[i];
    }
}
在第一种情况下,您在[1,n]范围内迭代,其中n是包含的。在第二种情况下,您在[2,n]范围内迭代,其中n是包含的

但是你的a数组有n个元素,所以它的范围是[0,n,其中n个是独占的。

int count;
此代码

printf("%lld\n", count);
是未定义的行为

根据,格式说明符ll用于long int类型:

ll指定以下的d、i、o、u、x或x 转换说明符应用于长整型或无符号长整型参数;或以下n个转换说明符应用于 指向长整型参数的指针

如果转换规范无效,则行为无效 未定义


您的范围以及两个for循环在循环内的索引都是错误的。您正在访问数组a的边界之外。数组索引范围是0…N-1。