二维数组的动态分配(new)、初始化(…
2014-09-25 13:30
99 查看
本文转自:http://apps.hi.baidu.com/share/detail/43315704
一维数组的动态分配,初始化和撤销都好说,几乎每一本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];
这样的错误写法。
一维数组的动态分配,初始化和撤销都好说,几乎每一本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];
这样的错误写法。
相关文章推荐
- 二维数组的动态分配(new)、初始化(…
- 二维数组的动态分配(new)、初始化(memset)和撤销(delete)
- 二维数组的动态分配(new)、初始化(memset)和撤销(delete)
- C++数组的动态分配(new)、初始化(memset)和撤销(delete)
- C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- new 二维数组的动态分配和删除
- C++用new动态分配数组内存后用()进行初始化
- c++ 动态分配二维数组 new 二维数组
- C++ 关于二维数组的动态分配和释放——方法一(new)
- 动态分配二维数组以及new的用法
- c++ new delete 动态分配二维数组
- 数组的动态分配(new)、初始化(memset)和撤销(delete)
- 如何在C/C++中动态分配二维数组
- 二维数组的动态分配及参数传递
- 二维数组定义以及动态分配空间 (转)
- 动态分配二维数组
- 动态内存分配- new/delete 和malloc/free的区别
- 二维数组的定义(动态初始化、静态初始化)、初始化格式及其操作、java中的参数传递方式,面向对象的基本概念
- 动态分配二维数组