【问题标题】:incorrect outputs in two arrays C两个数组 C 中的错误输出
【发布时间】:2015-03-20 05:02:48
【问题描述】:

当我尝试填充两个数组时,输出不正确,但是当我尝试填充一个正常工作的数组时,我找不到错误,我也尝试使用指针

两个数组:输出错误

#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
    }
}

【问题讨论】:

  • 你期望的输出是什么,你想要的输出是什么。通过编辑来更新您的问题(不要使用 Edit 或 **Update,该网站有编辑历史记录)并包含此信息。
  • 对于此类寻求帮助修复错误的问题,您需要向我们展示您的输入、输出和预期输出。

标签: c function output


【解决方案1】:

C 中的数组索引为 0。

也就是说,数组开始的索引是0,数组的最后一个元素是size_of_array - 1

在您的showArrays() 中, 您尝试访问数组 a[]b[] 的元素它们不是数组的一部分

因此,您需要将每个 for 循环的终止条件从 i &lt;= MAX 更改为 i &lt; 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]); 
    }
}

访问数组的元素越界会导致未定义的行为。

【讨论】:

    【解决方案2】:

    改变

    for(i = 0; i <= MAX; i++)
    

    for(i = 0; i < MAX; i++)
    

    错误是您声明了长度为1 的数组并试图访问索引1 (a[1])。

    相反,您必须计算从0N-1 的索引,其中N 是数组的长度

    【讨论】:

      【解决方案3】:

      嗯,这对我来说似乎工作正常,但这是我认为错误的地方:

      您已经定义了一个长度为 1 的数组 (int a[1]),但您的 for 循环迭代了 2 次,读取 a[0] 和 a[1]。其中一个不存在,因为 a 的长度为 1!我的编译器为我整理了它,但不要指望它。

      【讨论】:

        【解决方案4】:

        当您将数组声明为 a[1] 时,您只能在数组中存储单个值。您被声明为两个数组。

        它会不断地分配内存。就像

           |  4bytes  |  4bytes  |                         |
           a          b                                    n.
        

        a 和 b 各占 4 个字节,所以当我们赋值为 a[1] 时,它会引用 b[0] 的地址,而当你定位 b[1] 时,它会定位下一个空白处。

        因此,当您尝试打印 a[1] 时 - 它会打印 b[0] 的值,它也被称为未定义行为。

        【讨论】:

          【解决方案5】:

          您分配的数组大小为 1,因此您只能在该数组中存储一个值,但在 for 循环中您会得到两个数组输入,因此第一个输入取 a[0],发送输入取 b[0]。但是在那个 for 循环中,你会为一个未定义行为的数组获得两个输入。

          【讨论】:

            【解决方案6】:

            你的代码

             for(i = 0; i <=MAX; i++)
            

            写喜欢

            for(i = 0; i < MAX; i++)
            

            您的数组长度为 1。数组以 0 开头,以 length-1 结尾。

            【讨论】:

              【解决方案7】:

              如果数组被声明为具有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 将用作索引。

              考虑到这两个函数都没有返回值。所以函数的返回类型应该是void

              您还应该在声明函数showArrays之前使用与声明函数fillArrays相同的方式。在函数内部,数组没有改变,那么函数可以声明为

              void showArrays(const int a[], const int b[]);
              

              相对于函数 main 也符合 C 标准

              它应该被定义为一个返回类型并且没有参数:

              int main(void) { /* ... */ } 
              

              不是

              int main() { /* ... */ } 
              

              【讨论】:

                【解决方案8】:

                让我们从基础开始简单地解释一下。
                当你创建一个像

                这样的数组时
                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&lt;= Max,这个循环就会继续。换句话说,当i 变为2 时退出循环。因此,您尝试用两个值填充一个只能保存一个值的数组,从而导致数组越界,从而导致未定义的行为(无法预测未定义的行为,结果将取决于您的编译器,因此很难有人预测会发生什么)。

                要解决这个问题,您只需将 for 循环条件更改为

                for(i = 0; i < MAX; i++)
                

                嗯,希望你明白你的错误。

                【讨论】:

                  猜你喜欢
                  • 2012-08-21
                  • 2021-07-12
                  • 1970-01-01
                  • 2013-11-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-10
                  • 2011-12-10
                  相关资源
                  最近更新 更多