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.