新手求教。打素数表遇到个诡异的有关问题。

新手求教。。打素数表遇到个诡异的问题。。。
有一段是这样的
for(i=2;i<MAX;i++)
        for(j=2;j*i<MAX;j++)//j=i???
                prime[j*i]=0;
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”
百思不解。。。求高手解释下原因,感激不尽~~~

附下我的完整代码:
#include<cstdio>
#include<cstdlib>
#define MAX 100000
using namespace std;
int main()
{
    long a,d,n,i,j;
    bool *flag=(bool *)malloc(MAX*sizeof(bool));

    flag[1]=0;
    for(i=2;i<MAX;i++)
        flag[i]=1;
    for(i=2;i<MAX;i++){
        for(j=2;j*i<MAX;j++){
                flag[j*i]=0;
            }
        }
    while(scanf("%ld%ld%ld",&a,&d,&n)!=EOF){
        if(a==0&&d==0) break;
        while(n){
            if(flag[a]==1)
                n--;
            a+=d;
        }
        printf("%ld\n",a-d);
    }
    free(flag);

    return 0;
}
算法 素数

------解决方案--------------------
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”

 i == j时,,当 i很大时,== 10000吧  j*i的值 很很大,那么    prime[10000 * 10000] = 0; 果断越界

越界会发生什么,不可知
------解决方案--------------------
flag只分配了MAX的内存,你却要读MAX*MAX范围的数据
------解决方案--------------------
是哪行报的异常?