两个数组 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]).

相反,您必须计算从 0N-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];

你得到一个索引为 01 的数组(一个有 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() { /* ... */ }