动态二维数组的分配与释放
二维数组的动态分配与释放

二维数组的动态分配与释放1. C语言动态分配二维数组(1)已知第二维Code-1char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char) * M*N); //注意M为数组的行,N为数组的列printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N*sizeof(char),一维数组free(a);(2)已知第一维Code-2char* a[M];//指针的数组int i;for(i=0; i<M; i++)a[i] = (char *)malloc(sizeof(char) * n);printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<M; i++)free(a[i]);(3)已知第一维,一次分配内存(保证内存的连续性)Code-3char* a[M];//指针的数组int i;a[0] = (char *)malloc(sizeof(char) * M * n);for(i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针free(a[0]);(4)两维都未知Code-4char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指针数组for(i=0; i<m; i++){a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<m; i++){free(a[i]);}free(a);(5)两维都未知,一次分配内存(保证内存的连续性)Code-5char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指针数组a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间for(i=1; i<m; i++) //定义每个指针指向的空间大小{a[i] = a[i-1] + n;}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针free(a[0]); //只需要释放a[0]free(a);2.C++动态分配二维数组(1)已知第二维Code-6char (*a)[N];//指向数组的指针a = new char[m][N];printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N,一维数组delete[] a;(2)已知第一维Code-7char* a[M];//指针的数组for(int i=0; i<M; i++)a[i] = new char[n];printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<M; i++)delete[] a[i];(3)已知第一维,一次分配内存(保证内存的连续性)Code-8char* a[M];//指针的数组a[0] = new char[M*n];for(int i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针delete[] a[0];(4)两维都未知Code-9char **a;a = new char* [m];//分配指针数组for(int i=0; i<m; i++){a[i] = new char[n];//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<m; i++)delete[] a[i];delete[] a;(5)两维都未知,一次分配内存(保证内存的连续性)Code-10char **a;a = new char* [m];a[0] = new char[m * n];//一次性分配所有空间for(int i=1; i<m; i++){a[i] = a[i-1] + n;//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针delete[] a[0];delete[] a;多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!。
c++二维数组讲解

c++二维数组讲解C++中的二维数组是指由多个一维数组组成的数据结构,可以理解为表格或矩阵。
在讲解C++二维数组时,我将从以下几个方面进行讲解:1. 定义和声明二维数组:在C++中,我们可以使用以下语法来定义和声明一个二维数组:cpp.数据类型数组名[行数][列数];例如,我们可以声明一个3行4列的整型二维数组:cpp.int array[3][4];2. 初始化二维数组:可以使用下述方式对二维数组进行初始化:逐个元素初始化:cpp.int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};使用循环进行初始化:cpp.int array[3][4];for (int i = 0; i < 3; i++) {。
for (int j = 0; j < 4; j++) {。
array[i][j] = i 4 + j + 1;}。
}。
3. 访问二维数组元素,可以使用下标运算符`[][]`来访问和修改二维数组中的元素。
注意,下标从0开始计数。
cpp.int value = array[1][2]; // 访问第2行第3列的元素。
array[0][1] = 10; // 修改第1行第2列的元素为10。
4. 多维数组的内存布局,C++中的二维数组在内存中是连续存储的,行与行之间紧密相邻。
可以使用指针来访问和遍历二维数组。
5. 二维数组作为函数参数,可以将二维数组作为函数的参数传递。
在函数声明时,需要指定二维数组的列数,行数可以省略。
cpp.void printArray(int arr[][4], int rows) {。
for (int i = 0; i < rows; i++) {。
for (int j = 0; j < 4; j++) {。
cout << arr[i][j] << " ";}。
最新C++二维动态数组的申请与_释放汇总

C++二维动态数组的申请与_释放一维数组是指针,可将二维数组看作是指针的指针:每一行是一个一维数组,而列是指向行的指针。
在动态创建时,先分配指向行的指针空间,再循环维每一行申请空间。
#include <iostream>using namespace std;int main(){//[3]4] //三行四列的二维数组int x,y;int i,n,k;x=3;y=4;int **p;p = new int*[x]; //行 //申请行的空间//每行的列申请空间for(i=0; i<x;i++){p[i] = new int [y];}//赋值,k=0;for(i=0;i<x;i++){for(n=0;n<y;n++){p[i][n] = k;k++;}}//显示刚才的赋值for(i=0;i<x;i++){for(n=0;n<y;n++){cout << p[i][n] << "\t"; }cout << endl;}//删除刚才申请的内存for(i=0;i<x;i++){delete [] p[i];}delete [] p;return 0;今天归纳总结了一下,希望以后的朋友可以少走些弯路:)一:关于指针和堆的内存分配先来介绍一下指针:指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。
既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。
不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型而已,了解了这个基本上所有的问题都好象都变的合理了。
在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成:指针类型指针变量名=new 指针类型 (初始化);delete 指针名;例如:1、 int *p=new int(0);它与下列代码序列大体等价:2、int tmp=0, *p=&tmp;区别:p所指向的变量是由库操作符new()分配的,位于内存的堆区中,并且该对象未命名。
二维数组分配内存

C 二维数组动态分配和释放(1)已知第二维Code-1char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char *) * m);printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N,一维数组free(a);(2)已知第一维Code-2char* a[M];//指针的数组int i;for(i=0; i<M; i++)a[i] = (char *)malloc(sizeof(char) * n);printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<M; i++)free(a[i]);(3)已知第一维,一次分配内存(保证内存的连续性)Code-3char* a[M];//指针的数组int i;a[0] = (char *)malloc(sizeof(char) * M * n);for(i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针free(a[0]);(4)两维都未知Code-4char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指针数组for(i=0; i<m; i++){a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<m; i++){free(a[i]);}free(a);(5)两维都未知,一次分配内存(保证内存的连续性)Code-5char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指针数组a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间for(i=1; i<m; i++){a[i] = a[i-1] + n;}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针free(a[0]);free(a);2.C++动态分配二维数组(1)已知第二维Code-6char (*a)[N];//指向数组的指针a = new char[m][N];printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N,一维数组delete[] a;(2)已知第一维Code-7char* a[M];//指针的数组for(int i=0; i<M; i++)a[i] = new char[n];printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<M; i++)delete[] a[i];(3)已知第一维,一次分配内存(保证内存的连续性)Code-8char* a[M];//指针的数组a[0] = new char[M*n];for(int i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d\n", sizeof(a));//4*M,指针数组printf("%d\n", sizeof(a[0]));//4,指针delete[] a[0];(4)两维都未知Code-9char **a;a = new char* [m];//分配指针数组for(int i=0; i<m; i++){a[i] = new char[n];//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针for(i=0; i<m; i++)delete[] a[i];delete[] a;(5)两维都未知,一次分配内存(保证内存的连续性)Code-10char **a;a = new char* [m];a[0] = new char[m * n];//一次性分配所有空间for(int i=1; i<m; i++){a[i] = a[i-1] + n;//分配每个指针所指向的数组}printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//4,指针delete[] a[0];delete[] a;多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!3.静态二维数组作为函数参数传递如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。
C语言中动态分配二维数组

}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
for(k=0;k<n3;k++)
free(array[i][j][k]);//释放第四维指针
}
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//释放第三维指针
}
} array[][][](整型常量)
当然,你可以把它们整合在一起为:
int i,j,k;
int n1,n2,n3;
int ***array;
scanf("%d%d%d",&n1,&n2,&n3);
array=(int***)calloc(n1,sizeof(int**));
for(i=0;i<n1;i++)
for(k=0;k<n3;k++)
{
array[i][j][k]=i+j+k+1;
printf("%d\t",array[i][j][k]);
}
puts("");
}
puts("");
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//释放第三维指针
二维数组指针及二维动态数组的分配问题

⼆维数组指针及⼆维动态数组的分配问题在我以前的⽂章中都有讲过关于数组指针及指针数组的相关问题,但是讲得不够深⼊,我后来后了别⼈写的博客后觉得⼈家的确实写得好,也学到了不少东西,对以前的问题有深的领悟了,于是准备结合这些博客和⽂章再稍微深⼊⼀点讲讲这些问题。
这些指针的问题是C语⾔中的基础与关键⽽且⼀旦出现这些问题,不太好找bug的来源,有时候不得不借助反汇编。
参考⽂章:C语⾔指针数组和数组指针如何在C/C++中动态分配⼆维数组现在我们知道了指针数组与数组指针的区别了嘛。
int *p1[10]; (1)这个就是指针数了啊,我们主要是看运算符的优先级,因为[ ] 的优先级⽐ * 的优先级要⾼,于是知p1⾸先和[10]结合-----p1[10]表⽰的是含有10个元素的数组,那么数组中元素类型呢?那就是 int * 也就是说 p1 是含有10元素为 int* 的数组名,注意p1是数组名⽽⾮什么指针。
int (*p2)[10]; (2)⽽现在就不同了,我们的(*p2)说明p2是指针,⽽不再像是(1)中的类型名了,嗯好,这个 * 是专门⽤来修饰p2的。
同样【10】表⽰含有10个元素啦,⽽int表⽰这个数组⾥⾯的内容是int 型。
则知道我们这个数组是没有数组名的。
其实(2)式组合起来说明p2是⼀个指针,但不是⼀个⼀般的指针,⽽是⼀个指向含有10个int型的数组的指针。
那有⼈问?这个p2指针和(3)int* p (3)中的p(普通的int型指针)有区别吗?当然是有区别的!不然这不是脱了裤头放屁-----多此⼀举。
搞得⼤家对(2)式不太理解。
分析代码:int a[4]={1,2,3,4};int (*pp)[4]=&a;std::cout<<pp[0];这个输出int a[4]={1,2,3,4};int (*pp)[4]=&a;std::cout<<pp[0][0];这个输出int a[4]={1,2,3,4};int (*pp)[4]=&a;std::cout<<*(pp+1);这个输出其实这个数组针⼀般是⽤在⼆维数组中的,因为如果我们声明int (*pp)[4]则我们对pp++;那么pp指针移动的可不只是⼀个int型的长度呢,那可是sizeof(int)*4的长度哦。
如何在C++中动态分配二维数组

如何在C++中动态分配二维数组这个问题应该是我以前在CSDN蹭分时回答次数比较多的一个问题了,我的回答一般是三种方法:(1)用vector的vector,(2)先分配一个指针数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,可以用a[x][y]这样的写法,缺点是它相当于C#中的一个锯齿数组,内存空间不连续。
(3)直接分配一个x*y大小的一维数组,这样保证空间是连续的,但访问数组元素不直观。
对于我这个"经典"回答,我那时还一直是挺得意的,至少从蹭分的角度来看,这样回答还是很有效的。
今天在ChinaUnix论坛闲逛时看到一个贴子,再次证明了我在C++方面才疏学浅。
#include#include#includevoid **darray_new(int row, int col, int size){void **arr;arr = (void **) malloc(sizeof(void *) * row + size * row * col); if (arr != NULL){void *head;head = (void *) arr + sizeof(void *) * row; memset(arr, 0, sizeof(void *) * row + size * row * col); while (row--)arr[row] = head + size * row * col;}return arr;}void darray_free(void **arr){if (arr != NULL)free(arr);}嗯,连续分配内存,而且可以用a[x][y]的方式来访问!可谓二维数组动态分配的绝妙方法!这段程序是C的,似乎要改成支持对象分配的C++版也不是什么难事(不过估计得用上placement new吧,嗯,需要再思考一下......)。
动态二维数组的用法

1、动态创建二维数组正确的做法:方法一:void fun(int iRow, int iCol){CString** ppData;ppData = new CString*[iRow];for(int i=0;i< iRow;++i){ppData[i] = new CString[iCol];}}方法二:void fun(int iRow, int iCol){CString* pTemp;CString** ppData;pTemp =new CString[iRow*iCol];ppData = new CString*[iRow];for(int i=0;i< iRow;++i){ppData[i] =&pTemp[i*iCol];}}ppData就是我们创建的二维数组。
错误的做法:void fun(int iRow, int iCol){CString** ppData;ppData = new CString[iRow][iCol];}错误提示:error C2540: non-constant expression as array bound2、使用二维数组(1)我们在应用中有时候会需要把一个二维数组作为参数传入一个函数中,这个函数的形式怎样才是正确的?void fun(CString** str, int iRow, int iCol); 正确void fun(CString str[][], int iRow, int iCol); 错误,没有指定数组的列数!void fun(CString* str, int iRow, int iCol); 正确,可以在函数内部对str处理,变成一个二维数组(2)现在我们定义了fun,void fun(CString** str, int iRow, int iCol);然后我们需要在外面传入一个二维数组,应该如何传入?正确做法:CString** test;//分配test的空间,给test初始化值……fun(test, 2, 1);错误的做法:CString test[2][1];//给test初始化值……fun(test, 2, 1);会提示错误:cannot convert parameter 1 from 'WTL::CString [2][1]' to 'WTL::CString **'(3)如果需要把申请的二维数组的指针传给一个struct的成员,要注意先申请struct的空间struct Info{CString** data;int x;int y;}错误的语句:Info* infoTest;//申请ppData空间infoTest->data = ppData; 出错!崩溃正确的语句是:Info* infoTest = (Info*)malloc(sizeof(Info)); 正确//申请ppData空间infoTest->data = ppData;(4)删除二维指针对于方法一创建的数组:int j;for(j=0;j< iRow;j++){delete[] ppData[j];}delete[] ppData;【注:方法一:void fun(int iRow, int iCol){CString** ppData;ppData = new CString*[iRow];for(int i=0;i< iRow;++i){ppData[i] = new CString[iCol];}}】对于方法二创建的数组:delete[] ppData;delete[] pTemp;【注:方法二:void fun(int iRow, int iCol){CString* pTemp;CString** ppData;pTemp =new CString[iRow*iCol];ppData = new CString*[iRow];for(int i=0;i< iRow;++i){ppData[i] =&pTemp[i*iCol];}}例如构造一个整型的二维数组:int row,col;(设已被初始化)int **p = new int* [row];for(int i = 0; i < row; i++)p[i] = new int[col];////////////////////////////////删除时:for(int i = 0 i < row; i++)delete[] p[i];delete [] p;---------------------------------------------------------------看看下面的;/*计算方法--动态开辟内存空间--yanfeng*//*注意:1).本程序已解决了由用户自由输入n的值,已决定矩阵中元素的个数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态二维数组的分配与释放两种方法:1.先定义一个一维数组的类型,然后再用该类型定义一个一维数组(实际上已经成为二维的),相当于递归定义typedef int array[COL]; //使用typedef定义一个具有COL个元素的数组类型array *a; //定义二维数组,与一维数组相同a=new array[row]; //为该一维数组(实际上二维)申请空间该方法定义的动态二维数组的释放只需以下语句即可:delete[] a;a=NULL;2.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组int **b=new int*[row]; //分配一个指针数组,将其首地址保存在b中for(i=0;i<row;i++) //为指针数组的每个元素分配一个数组b[i]=new int[col];该方法定义的动态二维数组的释放需先释放指针数组的每个元素指向的数组,然后再释放该指针数组:for(i=0;i<row;i++){delete [col]b[i];b[i]=NULL;}delete [row]b;b=NULL;注意不同IDE环境对包含文件,局部变量的不同处理。
代码如下(visual studio 2005版本):/************************************************************************* 动态二维数组(visual studio 2005版本)************************************************************************/#include <iostream>#include <conio.h>using namespace std;#define ROW 4 //行数#define COL 6 //列数//使用typedef定义一个具有ROW个元素的数组类型typedef int array[COL];int main(){int row=ROW; //二维数组的行数int col=COL; //二维数组的列数int i,j,n=1;//////////////////////////////////////////////////////////////////////////array *a; //定义二维数组,与一维数组相同a=new array[row];////////////////////////////////////////////////////////////////////////////赋值for(i=0;i<row;i++)for(j=0;j<col;j++)a[i][j]=n++;cout <<"solution 1:"<<endl;for(i=0;i<row;i++){for(j=0;j<col;j++)cout<<a[i][j]<<" ";cout<<endl;}////////////////////////////////////////////////////////////////////////////释放,或者delete[row] a; 或者delete[row]a; 或者delete [row]a;// 或者delete[] a; 或者delete[]a; 或者delete []a; 或者delete [] a; delete[] a;a=NULL;cout<<endl;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////使用数组指针//分配一个指针数组,其首地址保存在b中int **b=new int*[row];//为指针数组的每个元素分配一个数组for(i=0;i<row;i++)b[i]=new int[col];////////////////////////////////////////////////////////////////////////////赋值for(i=0;i<row;i++)for(j=0;j<col;j++)b[i][j]=n++;cout <<"solution 2:"<<endl;for(i=0;i<row;i++){for(j=0;j<col;j++)cout<<b[i][j]<<" ";cout<<endl;}////////////////////////////////////////////////////////////////////////////释放for(i=0;i<row;i++){delete [col]b[i];b[i]=NULL;}delete [row]b;b=NULL;//////////////////////////////////////////////////////////////////////////getch();return 0;}代码如下(visual studio 6版本):/************************************************************************ * 动态二维数组(visual studio 6版本)************************************************************************/ #include <iostream.h>#define ROW 4 //行数#define COL 6 //列数//使用typedef定义一个具有COL个元素的数组类型typedef int array[COL];int main(){int row=ROW; //二维数组的行数int col=COL; //二维数组的列数int i,j,n=1;//////////////////////////////////////////////////////////////////////////array *a; //定义二维数组,与一维数组定义相同a=new array[row];////////////////////////////////////////////////////////////////////////////赋值for(i=0;i<row;i++)for(j=0;j<col;j++)a[i][j]=n++;cout <<"solution 1:"<<endl;for(i=0;i<row;i++){for(j=0;j<col;j++)cout<<a[i][j]<<" ";cout<<endl;}////////////////////////////////////////////////////////////////////////////释放,或者delete[row] a; 或者delete[row]a; 或者delete [row]a;// 或者delete[] a; 或者delete[]a; 或者delete []a; 或者delete [] a;delete[] a;a=NULL;cout<<endl;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////使用数组指针,分配一个指针数组,并将其首地址保存在b中int **b=new int*[row];//为指针数组的每个元素分配一个数组for(i=0;i<row;i++)b[i]=new int[col];////////////////////////////////////////////////////////////////////////////赋值for(i=0;i<row;i++)for(j=0;j<col;j++)b[i][j]=n++;cout <<"solution 2:"<<endl;for(i=0;i<row;i++){for(j=0;j<col;j++)cout<<b[i][j]<<" ";cout<<endl;}////////////////////////////////////////////////////////////////////////////释放for(i=0;i<row;i++){delete [col]b[i];b[i]=NULL;}delete [row]b;b=NULL;//////////////////////////////////////////////////////////////////////////return 0;}运行结果如下:。