C语言 在给定的代码中数组大小的奇怪行为的解释是什么?[重复]

7jmck4yq  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(78)

此问题在此处已有答案

In C, why can we access an array element whose index is out of range?(3个答案)
17天前关闭.

#include<stdio.h>
int main(){
    int n;
    printf("Enter the number:");
    scanf("%d",&n);
    int array[n];

    for (int i=0;i<=n;i++){
        printf("%dEnter the number:",i);
        scanf("%d",&array[i]);
    }

    for (int i=n;i>=0;i--){
        printf("%d\n",array[i]);
    }
}

其中大小被定义为给定的数字,但是当将值放入循环中时,大小会增加。期望数组只接受5个值,但它接受的值超过5个。

wribegjk

wribegjk1#

1.第一个循环写入数组array[n]超出了边界(循环执行n+1次)。这是一个未定义的行为。它可能会覆盖无关的内存,通常会导致segfault。
C中的数组索引为0,因此第一个元素是array[0],最后一个元素是array[n-1]
下面修改后的循环是C中的标准习惯用法;如果它是其他任何东西,经验丰富的C开发人员会格外小心地查看它。
1.第二个循环读取出边界array[n](n+1)。这是未定义的行为。
1.检查n>=1和合理的大小,否则程序可能会因耗尽堆栈空间而崩溃。
1.检查scanf()的返回值,否则您可能会对未初始化的变量进行操作,这是未定义的行为。
1.为了可读性而修改你的代码(这很重要)。

#include <stdio.h>

#define MAX_N 100

int main(void) {
    int n;
    printf("Enter the number:");
    if(scanf("%d", &n) != 1) {
        fprintf(stderr, "scanf() failed\n");
        return 1;
    }
    if(n <= 0 || n > MAX_N) {
        fprintf(stderr, "n is out of range\n");
        return 1;
    }
    int array[n];
    for(int i=0; i<n; i++) {
        printf("%dEnter the number:", i);
        if(scanf("%d", &array[i]) != 1) {
            fprintf(stderr, "scanf() failed\n");
            return 1;
        }
    }
    for(int i=n-1; i>=0; i--)
        printf("%d\n", array[i]);
}

字符串
示例会话:

Enter the number:3
0Enter the number:1
1Enter the number:2
2Enter the number:3
3
2
1

gj3fmq9x

gj3fmq9x2#

问题是i将等于0, 1, 2, 3, 4, 5。只要数一下数字,就有6个。这就是为什么for循环的主体被执行了5次以上。
如果你想让这个for循环执行n次,写for (int i = 0; i < n; i++) // ...是很常见的。

相关问题