繁体   English   中英

为什么此C程序的输出不正确

[英]Why output of this C program is not correct

我已经编写了这样的交流程序,希望能获得正确的输出。

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

 int main()
 {
     int t;
     scanf("%d", &t);
     int a[t-1], b[t-1];
     //printf("%d\n",sizeof(a) );
     do{
     scanf("%d %d", &a[t-1], &b[t-1]);
     }while(--t);

    do{
         printf("%d\n",a[t-1] + b[t-1]);
    }while(--t);

    return 0;
 }

但是我得到的是随机值,这个程序怎么了? 尝试输入尝试次数,然后输入值,然后打印这些值的加法。

PS数组初始化在这里是动态的,是否有效?

声明长度为10的数组时,索引为09 该数组没有索引10

在您的代码中,数组的大小为t-1

int a[t-1], b[t-1];

因此,在您的第一次迭代中, scanf()printf()语句访问a[t-1] ,该参数不存在。 而且,由于它是一个do while循环,因此可以保证至少运行一次。

访问数组超出其边界是未定义的行为 因此,正如Cool Guy在评论中指出的那样,任何事情都可能发生。

在读取所有值和打印所有值之间,您永远不会将t重置为其原始值。 您可能需要执行此操作,可能使用另一个变量来保存其原始值。

数组大小应为常数,不能在运行时设置。 对于运行时内存分配,您需要将指针变量与malloc函数一起使用。 因此,首先您需要在声明时为变量t分配一个常量值。

提示,请务必在任何语句之前声明和初始化变量。 数组初始化应该在scanf之前进行,通过这样做,您可以清楚地看到问题,即您正在分配内存(随机地),然后从用户那里获得价值。 编译器必须做类似的事情,分配一些随机大小的内存,然后获取值t,现在此值t将仅在您的迭代中使用,而不用于数组分配,因为数组之前以一定的rand大小分配(无论有什么垃圾t在声明时指向的值)。 该程序有时会显示一些随机值,有时会在访问超出范围的内存时崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM