两个数组 C 中的错误输出
incorrect outputs in two arrays C
当我尝试填充两个数组时输出不正确,但是当我尝试填充一个正确工作的数组时,我找不到错误,我也尝试使用指针
两个数组:输出错误
#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
}
}
改变
for(i = 0; i <= MAX; i++)
到
for(i = 0; i < MAX; i++)
错误是您声明了长度为 1
的数组并试图访问索引 1
(a[1]).
相反,您必须计算从 0
到 N-1
的索引,其中 N
是数组的长度
好吧,它对我来说似乎工作正常,但我认为这是错误的:
您定义了一个长度为 1 (int a[1]
) 的数组,但是您的 for
循环迭代了 2 次,读取了 a[0] 和 a[1]。其中一个不存在,因为 a 的长度为 1!我的编译器帮我整理好了,但不要指望它。
您的代码
for(i = 0; i <=MAX; i++)
点赞
for(i = 0; i < MAX; i++)
你的数组长度为1,数组以0开始,长度为1结束。
当您将数组声明为 a[1] 时,您只能存储单个值 array.you 声明为两个数组。
它将分配内存continuously.like
| 4bytes | 4bytes | |
a b n.
a和b各占4个字节,所以当我们赋值为a[1]时,它会引用b[0]的地址,而当你定位b[1]时,它会定位下一个空 space.
因此,当您尝试打印 a[1] 时 - 它会打印 b[0] 的值,这也被称为未定义行为。
您分配的数组大小为 1,因此您只能在该数组中存储一个值,但在 for 循环中,您获得数组的两个输入,因此第一个输入采用 a[0],发送输入采用 b[0]。但是在那个 for 循环中,你得到一个数组的两个输入,这是未定义的行为。
C 中的数组索引为 0。
这意味着,数组的开始的索引将是0
,而数组的最后元素数组将为 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]);
}
}
访问数组的元素越界会导致未定义的行为。
让我们从基础简单的解释一下。
当你创建一个像
这样的数组时
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
时,退出循环。因此,您尝试用两个值填充一个只能容纳一个值的数组,导致数组越界,从而导致未定义的行为(无法预测未定义的行为,结果将取决于您的编译器,因此有人很难预测可能发生的事情)。
要解决这个问题,您只需将 for 循环条件更改为
for(i = 0; i < MAX; i++)
嗯,希望你明白你的错误。
如果数组声明为具有 MAX
个元素,则其索引的有效范围为 0 : MAX - 1
,前提是 MAX 不等于 0。因此在您的示例中,MAX 等于 1那么该数组只有一个元素,访问该元素的有效索引为 0。
因此而不是循环
for(i = 0; i <= MAX; i++)
你必须写
for(i = 0; i < MAX; i++)
相当于
for(i = 0; i < 1; i++)
并且只有值为 0 的变量 i 将用作索引。
请注意,这两个函数 return 都不是一个值。所以函数的 return 类型应该是 void
.
您还应该在使用函数 showArrays
之前声明函数 showArrays
,就像您声明函数 fillArrays
一样。由于在函数内部数组没有改变,因此函数可以声明为
void showArrays(const int a[], const int b[]);
同样根据与函数 main 有关的 C 标准
It shall be defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
没有
int main() { /* ... */ }
当我尝试填充两个数组时输出不正确,但是当我尝试填充一个正确工作的数组时,我找不到错误,我也尝试使用指针
两个数组:输出错误
#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
}
}
改变
for(i = 0; i <= MAX; i++)
到
for(i = 0; i < MAX; i++)
错误是您声明了长度为 1
的数组并试图访问索引 1
(a[1]).
相反,您必须计算从 0
到 N-1
的索引,其中 N
是数组的长度
好吧,它对我来说似乎工作正常,但我认为这是错误的:
您定义了一个长度为 1 (int a[1]
) 的数组,但是您的 for
循环迭代了 2 次,读取了 a[0] 和 a[1]。其中一个不存在,因为 a 的长度为 1!我的编译器帮我整理好了,但不要指望它。
您的代码
for(i = 0; i <=MAX; i++)
点赞
for(i = 0; i < MAX; i++)
你的数组长度为1,数组以0开始,长度为1结束。
当您将数组声明为 a[1] 时,您只能存储单个值 array.you 声明为两个数组。
它将分配内存continuously.like
| 4bytes | 4bytes | |
a b n.
a和b各占4个字节,所以当我们赋值为a[1]时,它会引用b[0]的地址,而当你定位b[1]时,它会定位下一个空 space.
因此,当您尝试打印 a[1] 时 - 它会打印 b[0] 的值,这也被称为未定义行为。
您分配的数组大小为 1,因此您只能在该数组中存储一个值,但在 for 循环中,您获得数组的两个输入,因此第一个输入采用 a[0],发送输入采用 b[0]。但是在那个 for 循环中,你得到一个数组的两个输入,这是未定义的行为。
C 中的数组索引为 0。
这意味着,数组的开始的索引将是0
,而数组的最后元素数组将为 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]);
}
}
访问数组的元素越界会导致未定义的行为。
让我们从基础简单的解释一下。
当你创建一个像
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
时,退出循环。因此,您尝试用两个值填充一个只能容纳一个值的数组,导致数组越界,从而导致未定义的行为(无法预测未定义的行为,结果将取决于您的编译器,因此有人很难预测可能发生的事情)。
要解决这个问题,您只需将 for 循环条件更改为
for(i = 0; i < MAX; i++)
嗯,希望你明白你的错误。
如果数组声明为具有 MAX
个元素,则其索引的有效范围为 0 : MAX - 1
,前提是 MAX 不等于 0。因此在您的示例中,MAX 等于 1那么该数组只有一个元素,访问该元素的有效索引为 0。
因此而不是循环
for(i = 0; i <= MAX; i++)
你必须写
for(i = 0; i < MAX; i++)
相当于
for(i = 0; i < 1; i++)
并且只有值为 0 的变量 i 将用作索引。
请注意,这两个函数 return 都不是一个值。所以函数的 return 类型应该是 void
.
您还应该在使用函数 showArrays
之前声明函数 showArrays
,就像您声明函数 fillArrays
一样。由于在函数内部数组没有改变,因此函数可以声明为
void showArrays(const int a[], const int b[]);
同样根据与函数 main 有关的 C 标准
It shall be defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
没有
int main() { /* ... */ }