为什么这个C程序的输出不正确
我已经写了一个c程序像这样,希望得到正确的输出为什么这个C程序的输出不正确,c,C,我已经写了一个c程序像这样,希望得到正确的输出 #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]);
#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;
}
#包括
#包括
int main()
{
int t;
scanf(“%d”、&t);
int a[t-1],b[t-1];
//printf(“%d\n”,sizeof(a));
做{
scanf(“%d%d”、&a[t-1]、&b[t-1]);
}而(--t);
做{
printf(“%d\n”,a[t-1]+b[t-1]);
}而(--t);
返回0;
}
但是我得到的是随机值。这个程序怎么了?
尝试输入尝试次数,然后输入值,然后打印这些值的加法
附言
数组初始化在这里是动态的。它有效吗?如果无效,正确的方法应该是什么?在读取所有值和打印所有值之间,您永远不会将
t
重置为其原始值。您需要这样做,可能需要使用另一个变量来保存其原始值。在读取所有值和打印所有值之间,您永远不会将t
重置为其原始值。您需要这样做,可能需要使用另一个变量来保存其原始值。在读取所有值和打印所有值之间,您永远不会将t
重置为其原始值。您需要这样做,可能需要使用另一个变量来保存其原始值。在读取所有值和打印所有值之间,您永远不会将t
重置为其原始值。您需要这样做,可能需要使用另一个变量来保存其原始值。当您声明长度为10
的数组时,索引从0
到9
。该数组没有索引10
在代码中,数组的大小为t-1
int a[t-1], b[t-1];
因此,在您的第一次迭代中,scanf()
和printf()
语句访问一个[t-1],但它不存在。而且,由于它是一个do-while
循环,因此保证至少运行一次
在数组的边界之外访问数组是错误的。因此,正如Cool Guy在评论中指出的,任何事情都可能发生。当您声明长度为
10
的数组时,索引从0
到9
。该数组没有索引10
在代码中,数组的大小为t-1
int a[t-1], b[t-1];
因此,在您的第一次迭代中,scanf()
和printf()
语句访问一个[t-1],但它不存在。而且,由于它是一个do-while
循环,因此保证至少运行一次
在数组的边界之外访问数组是错误的。因此,正如Cool Guy在评论中指出的,任何事情都可能发生。当您声明长度为
10
的数组时,索引从0
到9
。该数组没有索引10
在代码中,数组的大小为t-1
int a[t-1], b[t-1];
因此,在您的第一次迭代中,scanf()
和printf()
语句访问一个[t-1],但它不存在。而且,由于它是一个do-while
循环,因此保证至少运行一次
在数组的边界之外访问数组是错误的。因此,正如Cool Guy在评论中指出的,任何事情都可能发生。当您声明长度为
10
的数组时,索引从0
到9
。该数组没有索引10
在代码中,数组的大小为t-1
int a[t-1], b[t-1];
因此,在您的第一次迭代中,scanf()
和printf()
语句访问一个[t-1],但它不存在。而且,由于它是一个do-while
循环,因此保证至少运行一次
在数组的边界之外访问数组是错误的。所以,正如Cool Guy在评论中指出的,任何事情都可能发生。数组大小应该是一个常量,不能在运行时设置。对于运行时内存分配,您需要使用带有malloc函数的指针变量。所以首先需要在声明时为变量t指定一个常量值
提示一下,在任何语句之前都要尝试声明和初始化变量。数组初始化应该在scanf之前,通过这样做,您可以清楚地看到问题所在,即您正在分配内存(一些随机内存),然后从用户那里获取值。编译器必须做类似的事情,分配一些随机大小的内存,然后得到值t,现在这个值t只会在迭代中使用,而不会用于数组分配,因为数组以前是用一些rand大小分配的(垃圾值t在声明时指向的值)。有时程序会显示一些随机值,有时访问超出限制的内存时可能会崩溃。数组大小应为常量,不能在运行时设置。对于运行时内存分配,您需要使用带有malloc函数的指针变量。所以首先需要在声明时为变量t指定一个常量值
提示一下,在任何语句之前都要尝试声明和初始化变量。数组初始化应该在scanf之前,通过这样做,您可以清楚地看到问题所在,即您正在分配内存(一些随机内存),然后从用户那里获取值。编译器必须做类似的事情,分配一些随机大小的内存,然后得到值t,现在这个值t只会在迭代中使用,而不会用于数组分配,因为数组以前是用一些rand大小分配的(垃圾值t在声明时指向的值)。有时程序会显示一些随机值,有时访问超出限制的内存时可能会崩溃。数组大小应为常量,不能在运行时设置。对于运行时内存分配,您需要使用带有malloc函数的指针变量。所以首先需要在声明时为变量t指定一个常量值 提示一下,总是尝试声明和初始化变量b