C++ 被定义的二维数组无法赋值,求教

#include<iostream>
using namespace std;

void main()
{
//以下语句定义一个二维数组,并对其元素赋值(数字1到200)
int a[20][10];
/*int t;
int i,j,k1,k2;*/
int i,j;
for(i=0;i<20;i++)
for(j=0;j<10;i++) a[i][j]=i*10+j+1;//这里我试过
//多种赋值方法,结论是只要对a[i][j]赋值,则出错
for(i=0;i<20;i++)
{
for(j=0;j<10;j++)cout<<a[i][j]<<'\t';
cout<<endl;
}

}

为什么只有200个元素的二维数组,编译器会分配给只读内存?以前我用同样性能的电脑定义过同样的数组就没出这个错误,是因为系统会随机给二维指针分配内存吗? 假如我用
int **a=new int*[20];
for(int i=0;i<20;i++) a[i]=new int[10];
电脑一定会分配合理内存吗?

for(j=0;j<10;i++) a[i][j]=i*10+j+1;
这句写错了,应该是j++,如果是i++数组就会越界,指针出错

改了后没问题

#include<iostream>
using namespace std;

void main()
{
//以下语句定义一个二维数组,并对其元素赋值(数字1到200)
int a[20][10];
/*int t;
int i,j,k1,k2;*/
int i,j;
for(i=0;i<20;i++)
for(j=0;j<10;j++) a[i][j]=i*10+j+1;//这里我试过
//多种赋值方法,结论是只要对a[i][j]赋值,则出错
for(i=0;i<20;i++)
{
for(j=0;j<10;j++)cout<<a[i][j]<<'\t';
cout<<endl;
}

}

后一个问题:如果你是静态分配(就像 int a[10][20])其内存空间是在编译的时候编译器就已经确定要分配多少内存,所有都是确定的,是无法改动的。而用new运算符动态分配的内存是在运行的时候根据内存实际情况分配的,地址什么的是不确定的,而且效率要低于静态编联分配的内存。
如果内存不足分配失败,将会返回一个空指针。
温馨提示:答案为网友推荐,仅供参考