gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:14:20 26 4
gpt4 key购买 nike

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

输出: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;
}

最佳答案

你的数组在栈上。跑到最后通常意味着您正在访问垃圾(因此调用未定义的行为),但它不一定会触发段错误。

在你的例子中,第一个 a[i]=20-i将第一个元素设置为值 20。因此,第一个 a[i]=a[a[i]]触发对 a[20] 的访问,这是结束。但很有可能它实际上正在访问变量 i — 假设编译器将它紧跟在数组之后 — 和 i当前为零,因此净效应为 a[0] = 0 .每次后续调用 a[i]=a[a[i]]保证完全在范围内,因为 a[i] < 20 .

关于c - 为什么下面的代码没有给出段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com