خوب، خدا رو شکر که بالاخره فهمیدی ارور ندادن کامپایلر دلیل درست بودن کد نیست ضمن اینکه همین الان کدی که برای تو درست کار میکنه، تو کامپایلر من runtime error میده.
کامپایلر عملا چیزی به نام آرایه داینامیک نمیشناسه! تو وقتی مینویسی:
a[i]
عملا کامپایلر فرض میکنه آرایه ای داریم که از آدرس a شروع شده و خونه شماره i رو تو لازم داری. پس کد تو تبدیل به این میشه:
a[i] ==> *(a+i)
و کامپایلر هیچ کنترل دیگه ای روی کد تو نداره. حالا ممکنه این آدرس وقتی غلط هست، خطای زمان اجرا بگیری و ممکنه نگیری! در هر صورت مسوولیت کنترل آدرس ها با خودته.
برای اینکه ماجرای تبدیل کد کامپایلر رو ببینی، یه کار جالب میشه کرد، کدت رو اینجوری بنویس و ببین چی میشه:
void main()
{
int i;
int *a=new int[2];
for(i=0;i<2;i++){
i[a]=i;
}
for(i=0;i<2;i++)
{
cout<<i[a]<<" ";
}
}