预期或意外的分段错误?

Expected or unexpected Segmentation errors?

我正在从事代码安全方面的工作。所以下面讨论的代码是已知的易受攻击的。

我想明白为什么运行下面的代码没有分段错误

#include <stdio.h>

int main(){
    int a[3]={0,1,2};
    for (int i=0; i<=400; i++)
      printf("value of a[%d] is %d\n",i, a[i]);      

}

但是运行下面的代码,循环边界从 400 更改为 4000,有分段错误?我想知道为什么在一种情况下出现分段错误,而在另一种情况下却没有。

#include <stdio.h>

int main(){
    int a[3]={0,1,2};
    for (int i=0; i<=4000; i++)
      printf("value of a[%d] is %d\n",i, a[i]);      

}

如前所述,当您访问超出限制的内存时,您会调用未定义的行为。 您的情况下的未定义行为可能会使程序崩溃(与 4,000 值一样)并可能打印任意值(与 400 值一样)。

假设当试图打印 4,000 个整数的数组时,您到达了不应该用于数据的内存(例如程序文本段),而当您使用400 个整数的数组,您仍在程序的堆栈区域(或堆、bss 段或数据段)。

这是 https://en.wikipedia.org/wiki/Code_segment

中描述的流程结构