为什么下面的代码没有给出分段错误?

Joa*_*oan 4 c arrays segmentation-fault

在下面的程序中,第二个循环中的代码不应该给出分段错误吗?
有人可以解释为什么以下代码没有给出分段错误并按预期工作?

输出:20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1

#include <stdio.h>
#define N 20

int main(){
    int a[N];
    int i;

    for(i=0;i<N;i++){
        a[i]=20-i;
        printf("%3d ",a[i]);
    }

    printf("\n\n");

    for(i=0;i<N;i++){
        a[i]=a[a[i]];
        printf("%3d ",a[i]);
    }

    printf("\n\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 10

你的数组在堆栈中.运行结束通常意味着您正在访问垃圾(因此调用未定义的行为),但它不一定会触发seg-fault.

在您的情况下,第a[i]=20-i一个元素将第一个元素设置为值20.因此,第一个元素a[i]=a[a[i]]触发访问a[20],这是一个结束.但是它实际上很有可能实际访问变量i- 假设编译器将其紧接在数组之后 - 并且i当前为零,因此nett效应将是a[0] = 0.每个后续的调用a[i]=a[a[i]]都保证完全在范围内,因为a[i] < 20.

  • 在那里提到的好点,Marcelo,关于它可能访问`i`. (2认同)