动态分配数组
来源:互联网 发布:手机影音转换软件 编辑:程序博客网 时间:2024/05/20 19:45
一维的数组就没什么好说的了。前两天做一个矩阵的东西,要动态分配二维的数组。开始还想着这东西简单啊,直接来:
int *a=new int[m][n];
结果,crash
仔细一看,发现a是int*而new是int**,于是改为如下:
int n,**a;
cin>>n;
for(int i=0;i<n;i++)*(a+i)=new(int[n]);
结果,crash again...
然后无奈的使出杀手锏——上网查资料吧,以下是搜索所得的动态二维分配方法:
(转自http://wlxblog.westgis.ac.cn/130/)
1.
A (*ga)[n] = new A[m][n]; ... delete []ga;
缺点:n必须是已知
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)
2.
A** ga = new A*[m]; for(int i = 0; i < m; i++) ga[i] = new A[n]; ... for(int i = 0; i < m; i++) delete []ga[i]; delete []ga;
缺点:非连续储存,程序烦琐,ga为A**类型
优点:调用直观,n可以不是已知
3.
A* ga = new A[m*n]; ... delete []ga;
缺点:调用不够直观
优点:连续储存,n可以不是已知
4.
vector > ga; ga.resize(m); //这三行可用可不用 for(int i = 1; i < n; i++) // ga[i].resize(n); // ...
缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)
优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长
5.
vector ga; ga.resize(m*n);
方法3,4的结合
6. 2的改进版(Penrose提供,在此感谢)
A** ga = new A*[m]; ga[0] = new A[m*n]; for(int i = 1; i < m; i++) ga[i] = ga[i-1]+n; ... delete [] ga[0]; delete [] ga;
缺点:程序烦琐,ga为A**类型
优点:连续储存,调用直观,n可以不是已知
其实这个问题也没什么复杂的,想一想,这里的int **a;没有被初始化,ie,天知道它现在指着哪一块内存,所以直接*a=new int[n]是不安全的,但问题是,如果是诸如int *a, *a=n,原则上也是不安全的,但在编译器那却可以通过,所以推断c++里指针和其他类型还是有着不一样的地方,或者是因为这里的new……不管因为什么,显然这又是一个不解,不知何年何月才能找到答案。深深感慨学习就是知道—无知的无限循环,或者说人生就是有涨有跌的股市大盘,再或者宇宙的本质就是矛盾的……(#)@$)%
- 动态分配数组
- 动态分配数组
- 动态分配数组
- 动态分配数组
- 动态分配数组
- 动态分配数组
- c++数组的动态分配
- 动态分配二位数组
- 动态分配二维数组
- 动态分配二维数组
- 如何动态分配二维数组
- 如何动态分配多维数组
- new 动态分配数组空间
- 动态分配二维数组
- 动态分配数组空间
- 动态分配二维数组
- 动态分配二维数组
- 二维数组动态分配
- META元素的使用
- 第三周--星期二
- 接触微精神分析学虚空帝国初步
- GridView中如何使用CommandField删除时,弹出确认框?
- Linux下JBoss不能显示JasperReport报表的解决方法
- 动态分配数组
- C++的学习
- sql server的自动编号
- VS2005下水晶报表的简单应用(VB.NET)
- Java的内存泄漏
- 游戏引擎剖析(三)
- 举一个简单例子来说明:如何在JSP中使用JavaBean
- 游戏引擎剖析(四)
- 图片上传类