两个数组C中的输出不正确

时间:2015-03-20 05:02:48

标签: c function output

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

两个阵列:输出错误

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

8 个答案:

答案 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)

C中的数组为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];

你得到一个索引为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时,退出循环。所以你试着填充一个数组,它只能容纳一个带有两个值的值,导致数组越界,这可能导致未定义的行为(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() { /* ... */ }