当我尝试填充两个数组时输出不正确,但是当我尝试填充一个正常工作的数组时,我找不到错误,我也尝试使用指针
两个阵列:输出错误
#include <stdio.h>
#define MAX 1
int fillArrays(int a[], int b[]);
int main() {
int a[MAX], b[MAX], i;
fillArrays(a, b);
showArrays(a, b);
getch();
return 0;
}
int fillArrays(int a[], int b[]) {
int i;
for(i = 0; i <= MAX; i++) {
printf("a[%d]: ", i);
scanf("%d", &a[i]);
}
for(i = 0; i <= MAX; i++) {
printf("b[%d]: ", i);
scanf("%d", &b[i]);
}
}
int showArrays(int a[], int b[]) {
int i;
for(i = 0; i <= MAX; i++) {
printf("%d", a[i]); //incorrect output
}
for(i = 0; i <= MAX; i++) {
printf("%d", b[i]); //incorrect output
}
}
答案 0 :(得分:0)
更改
for(i = 0; i <= MAX; i++)
到
for(i = 0; i < MAX; i++)
错误是您声明了长度为1
的数组并尝试访问索引1
(a [1])。
相反,您必须将索引从0
计算到N-1
,其中N
是数组的长度
答案 1 :(得分:0)
嗯,它似乎对我来说很好,但是我认为这是错误的:
您已经定义了一个长度为1(int a[1]
)的数组,但是您的for
循环重复了2次,读取了[0]和[1]。其中一个不存在,因为a长度为1!我的编译器为我整理了它,但不要指望它。
答案 2 :(得分:0)
您的代码
for(i = 0; i <=MAX; i++)
像写
for(i = 0; i < MAX; i++)
您的数组长度为1.数组以0开头,以length-1结尾。
答案 3 :(得分:0)
当您将数组声明为[1]时,您只能将单个值存储在数组上。您将声明为两个数组。
它将持续分配内存。比如
| 4bytes | 4bytes | |
a b n.
a和b取每4个字节,所以当我们分配值为a [1]时,它将引用b [0]的地址,当你找到b [1]时,它将定位下一个空的空间。
所以当你试图打印a [1]时 - 它会打印b [0]的值,它也被称为未定义的行为。
答案 4 :(得分:0)
你分配的数组大小是1,所以你只能在该数组中存储一个值,但在for循环中,你得到两个数组输入,所以第一个输入取[0]并发送输入取b [0]。但是在for循环中,你得到一个未定义行为的数组的两个输入。
答案 5 :(得分:0)
这意味着,数组开头的索引为0
,数组的 last 元素为size_of_array - 1
在showArrays()
中,
您尝试访问不属于数组的数组a[]
和b[]
的元素。
因此,您需要将每个for
循环的终止条件从i <= MAX
更改为i < MAX
。
修改后的代码:
#include <stdio.h>
#define MAX 1
int fillArrays(int a[], int b[]);
int main() {
int a[MAX], b[MAX], i;
fillArrays(a, b);
showArrays(a, b);
getch();
return 0;
}
int fillArrays(int a[], int b[]) {
int i;
for(i = 0; i < MAX; i++) {
printf("a[%d]: ", i);
scanf("%d", &a[i]);
}
for(i = 0; i < MAX; i++) {
printf("b[%d]: ", i);
scanf("%d", &b[i]);
}
}
int showArrays(int a[], int b[]) {
int i;
for(i = 0; i < MAX; i++) {
printf("%d", a[i]);
}
for(i = 0; i < MAX; i++) {
printf("%d", b[i]);
}
}
访问数组的越界会导致未定义的行为。
答案 6 :(得分:0)
让我们从基础知识中简单解释一下 当您创建类似
的数组时int array[2];
你得到一个索引为0
和1
的数组(一个包含2个索引的数组)。换一种说法,
array[0]
和array[1]
在您的代码中,Max
为1,这意味着数组只能存储1个值,即位置a[0]
和b[0]
。 (在索引Max - 1
)
但是在你的for循环中,你有条件
for(i = 0; i <= MAX; i++)
只要i
为<=
Max
,此循环就会继续。换句话说,当i
变为2
时,退出循环。所以你试着填充一个数组,它只能容纳一个带有两个值的值,导致数组越界,这可能导致未定义的行为(Undefined Behavior无法预测,结果将取决于你的编译器,所以对某人来说很难预测会发生什么。)
要解决此问题,您只需将for循环条件更改为
即可for(i = 0; i < MAX; i++)
嗯,希望你能理解你的错误。
答案 7 :(得分:0)
如果一个数组被声明为具有MAX
元素,则其索引的有效范围为0 : MAX - 1
,前提是MAX不等于0.因此在您的示例中,当MAX等于1时,则array只有一个元素,访问该元素的有效索引是0。
因此而不是循环
for(i = 0; i <= MAX; i++)
你必须写
for(i = 0; i < MAX; i++)
相当于
for(i = 0; i < 1; i++)
并且只有值为0的变量i将用作索引。
考虑到两个函数都没有返回值。所以函数的返回类型应该是void
。
此外,您应该使用与声明函数showArrays
相同的方式声明函数fillArrays
。由于函数内部没有更改数组,因此函数可以声明为
void showArrays(const int a[], const int b[]);
另外根据C标准相对于函数main
应使用返回类型int定义并且不带参数:
int main(void) { /* ... */ }
不
int main() { /* ... */ }