【C言語】vs2019での配列交差による無限ループ出力の解析

この実験は vs2019 X86 環境で行われます

この実験では、範囲外の配列が出力の無限ループにつながる状況を分析します。

実験的なコードは次のとおりです。

int main()
{
	int i = 0;
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		a[i] = 0;
		printf("%d\n", a[i]);
	}
	return 0;
}

コードから見ると、ループ内で配列が範囲外になっている. 物理アドレスの観点からコードを分析しないと、出力はアドレス a から始まり、13 個の 0 を出力すると思うでしょうが、実際の状況は次のとおりです。これは、以下に示すように、実際には無限ループ出力 0 です。

 

これはなぜですか?

それらの中で最も重要なのは、「プログラムによって割り当てられたスペースで、上位アドレスが最初に使用され、次に下位アドレスが使用される」ことです。この空間の使用規則によると、このプログラムでは i が最初に作成され、配列 a が後で作成されるため、a の範囲が範囲外の場合、i のアドレスは a の末尾のアドレスよりも大きくなります。 i を含む場合、i を 0 に再割り当てするため、i の値は常に 12 未満になり、無限ループが発生します。

Ok!理論はこのようなものであり、それが私が期待したものであるかどうかを確認するための実験:

 i のアドレスは a[12] のアドレスと同じなので、i が 12 の場合、a[12]=0 の演算により i は 0 に設定され、i が12 より大きいと、無限ループが発生します。

 

範囲外の場合、a[i]=0 は範囲外のスペースの内容も変更することが実験で判明したため、配列の範囲外操作は非常に危険です。

愚かな小さな考え:

前述のように、プログラムによって割り当てられた空間では、上位アドレスが最初に使用され、次に下位アドレスが使用されます.変数 i が配列の後に作成される場合、つまり、範囲外の空間には i が含まれません。 、そして i は a[i] 値によって変更されません。どうなりますか?

結果は次のとおりです。

0 を 13 個出力し、直接エラーを報告するが、以前に無限ループがあったときになぜエラーにならなかったのか? 個人的には、プログラムの最後にエラー報告があったと思いますが、前回は無限ループに陥っており、プログラムがエラーを報告する機会がありません。

おすすめ

転載: blog.csdn.net/peng_lv/article/details/128111488