一、问题的提出
//////////////////////////////////////////////////////
#include <iostream.h>
const int M=200;
void main()
{
double a[M][M], b[M][M];
double aa=0, bb=0;
for(int i=0; i<M; i++)
for(int j=0; j<M; j++)
{
a[i][j]=1.0;
b[i][j]=1.0;
aa+=a[i][j];
bb+=b[i][j];
}
cout<<"aa="<<aa<<", bb="<<bb<<endl;
}
////////////////////////////////////////////////////////
M=200,运行很正常,可以输出结果。当M=300时就会出现运行错误。
是不是C++中对数组大小有限制,怎么申请大数组呢?
高人指点:
你这种方法建的数组好象是存在STACK里, 大小有限制.
2维数组在C/C++里不是很好用.建议用一维数组代替, 可以用 NEW 建指针数组, 这样可以用大数组.
其实最好用VECTOR, 做动态时很方便, 而且从2维到3维也更自然一些
二、问题的解决
A.用一维数组代替,应用new、delete命令。
//////////////////////////////////////////////////////
#include <iostream.h>
const int M=500;
void main()
{
double *a, *b;
double aa=0, bb=0;
a=new double[M*M];
b=new double[M*M];
for(int i=0; i<M; i++)
for(int j=0; j<M; j++)
{
a[i+j*M]=1.0;
b[i+j*M]=1.0;
aa+=a[i+j*M];
bb+=b[i+j*M];
}
cout<<"aa="<<aa<<", bb="<<bb<<endl;
delete []a;
delete []b;
}
///////////////////////////////////////////////////////
OK,用NEW建指针数组,运行通过,M=1000都没问题, :)
B.用vector命令。
////////////////////////////////////////////////////////
#include <iostream.h>
#include <vector>
using std::vector;
const int M=1000;
void main()
{
vector <double> a(M*M);
vector <double> b(M*M);
double aa=0, bb=0;
for(int i=0; i<M; i++)
for(int j=0; j<M; j++)
{
a[i+j*M]=1.0;
b[i+j*M]=1.0;
aa+=a[i+j*M];
bb+=b[i+j*M];
}
cout<<"aa="<<aa<<", bb="<<bb<<endl;
}
////////////////////////////////////////////////////////////////
OK,好像也可以,不错不错。
C.网上找到个比较好的。
http://nothingnowhere.blogchina.com/4539351.html
c++中如何动态分配二维数组
关键词: 二维数组
#include<iostream.h>
void main()
{
int **p;
int N,M,s=0;
cin>>N>>M;
p = new int*[N];
for(int i=0;i<N;i++) { p[i] = new int[M]; }
for(int j=0;j<M;j++)
for(int k=0;k<N;k++)
{p[k][j]=s++; cout<<p[k][j]<<endl;}
}
/////////////////////////////////////////////////
这个方法确实不错,用起来更方便。