⼆维数组的动态分配(new)、初始化(…
本⽂转⾃:
⼀维数组的动态分配,初始化和撤销都好说,⼏乎每⼀本C++教材都会做出详细的说明。具体如下:
一维数组的定义和初始化动态分配(例如分配10个单元的): int *array=new int [10];
初始化:memset(array,0,sizeof(array)); (也可以利⽤⼀个for循环对其赋值初始化)
撤销:delete [] array;
下⾯来说⼆维数组的。
⼆维数组(n⾏m列)利⽤new来进⾏动态分配实际上相当于对n个m元数组进⾏动态分配,只不过我们不能⼀味的按照动态分配⼀维数组的⽅法来这项操作。MSVC⽬前还没有这般的⼈性化,具体应该这样做:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
array[i]=new int [5];
上⾯的操作完成了⼀个10⾏5列的⼆维数组array[10][5]的动态分配,可以看到我们先动态分配了⼀个10单元的数组的指针的指针的⾸地址给**array,然后再对其每个⾸地址进⾏遍历,同时完成⼀个5单元的数组的动态分分配,并把⾸地址给*array[i],从⽽最终完成了⼆维数组array[10][5]的动态分配。我们可以依此类推得到三维以⾄多维的数组的动态分配⽅法。
⼆维数组的初始化:如果把⼀维数组初始化办法照搬过来就会发现对于动态分配的⼆维数组并不适⽤。这就要理解到memset这个函数三个参数的含义。MSDN 对memset的描述如下:
memset
Sets buffers to a specified character.
void*memset(void*dest,intc,size_tcount);
可见memset只能作⽤于⼀个⼀维数组void*dest,因此最好的办法就是和⼆维数组的动态分配结合起来,new⼀个,memset⼀个。具体写法如下:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
array[i]=new int [5];
memset(array[i],0,5*sizeof(int));
}
可以看到这⾥的memset的第三个参数有了变化。这是很关键的!这其中的原因是什么呢?我现在也还不太清楚。。。。。⼤家先照着这么写吧
⼆维数组的撤销:delete [] array
对于⼆维数组的动态分配与释放
⾸先,动态⽀持数组的分配,必须⽤ new 来进⾏创建⼀段堆内存,其它的存贮区域不允许动态分配的产⽣。
其次,C++并没有提供真正的动态多维数组语法,想动态分配数组,必须通过⼀维动态数组组合形成⼀个类似多维数组的存贮形式,并不像静态分配多维数组,它们的⽤法虽说有些地⽅有相似之处,但不完全相同。
再次,有些⽹友有⼀些很BT的分配⽅式。
例如:
int (*p)[4] = new int[3][4];
解释:可能有些初学者认为这样是可取的,也是利⽤ new 分配的数组,就可以是动态的,那你的想法就错了,它的分配必须得有最外层 const 的⽀持—
int x = 3, y = 4;
int (*p)[y] = new int[x][y];//error,y必须是const。
所以这种⽅式不能达到真正的动态分配⼆维数组的⽬的,只能相当于半⾃动化的⼀个分配⽅式。
那么如果依靠下⾯的这种⽅式是正确的:
例:
int x = 3, y = 4;
int *p = new int*[x];//创建⼀个动态 int* 型数组
for (int i = 0; i < y; ++i)
p[i] = new int [x]; //再创建⼀个动态 int 型数组
for (int i = 0; i < y; ++i)
{
delete p[i];//由⾥⾄外,进⾏释放内存。 ---------------我认为是delete [] p[i];后来查到的帖⼦证实
p[i] = NULL;//不要忘记,释放空间后p[i]不会⾃动指向NULL值,还将守在原处,只是释放内存⽽已,仅此⽽已。
}
delete []p;
p = NULL;
它就是依靠⼀维数组的组合来完成,这样创建的动态数组就是⼀个全⾃动的个分配⽅式。
例(完美废⼈提供):
void * buf = malloc (x * y * sizeof (int) ); //这也是⼀个好⽅法,简单⽅便,但它是C⾥⾯的分配⽅式。
free(buf);//释放内存简单⽅便.
提⽰:千万不要有 int *p = new int[4][2]; 这样的错误写法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论