1. 程式人生 > >經典陣列越界例項與解析

經典陣列越界例項與解析

首先丟擲這個程式碼:

#include<stdio.h>
int main(){
	int i = 0;
	int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	for (i = 0; i <= 12; i++){
		a[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

在vs2013中debug的執行環境下,這個程式出現了死迴圈。 現在進行記憶體分析: 臨時變數i與arr儲存在棧上,棧先建立高地址,後建立低地址,所以i在高地址上。 而陣列a的建立從下標0開始由低地址到高地址建立。 棧中i和a的地址表示 所以,這個程式出現的死迴圈是因為陣列越界,i到12,而陣列下標只到9,在記憶體中的i與a[12]放在了同一塊記憶體中,所以在初始化a[12]=0時將i也賦值為0,所以i出現死迴圈。 當然,在不同的執行環境下出現死迴圈的邊界不同,例如在vc6.0中i<=10時程式就會出現死迴圈; 在Linux環境下i<=11時會出現死迴圈。