二维数组的动态分配,可扩充成多维数组

来源:互联网 发布:马丽 知乎 编辑:程序博客网 时间:2024/05/05 22:00

其实大部分还是引用的http://blog.csdn.net/morewindows/article/details/7664479这篇文章上面的第二部分


不过分配内存,使用了c++对应的new,和windows下面的HeapAlloc


原理其实就是下面的一个图:




确实就如该文章所说,还少一个对应二维string数组的情况。

但目前没有需要用到,用的是和再回来看看。


很多情况下都是用的Verctor,不过一般的面试笔试题还是用的数组结构较多


以下代码,通过g++ 4.7.2版本和vs2012、2010编译成功


// test2.cpp : 定义控制台应用程序的入口点。////#include "stdafx.h"#include "stdio.h"#include "iostream"//#include "MemCheck.h"   // Must appear last!#include "string.h"#ifdef _WIN32#include "windows.h"#endif///////////////////////////////////////////////////////////////////////////************************************************************************//*如果使用一位数组代替二维数组,是个不错的选择比如下面的代码:T *arr=new T[col*rol];arr(col*i+j)=k //代替arr[i][j]=k,delete[] arr;*//************************************************************************//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////函数:MallocArray2D(int row, int col)////目的:分配和释放二维十足////注释:参数:二维数组行和列的个数/////////////////////////////////////////////////////////////////////#ifdef _WIN32HANDLE hHeap;#endiftemplate<typename T>T** NewArray2D(int row, int col){int size = sizeof(T);int point_size = sizeof(T *);// 先申请内存,其中point_size * row表示存放row个行指针#ifdef _WIN32hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);T **array = (T **)(::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 ));#elseT **array = new T * [point_size * row + size * row * col];#endifif (array != NULL){memset(array, 0, point_size * row + size * row * col);T *head = (T *)((long)array + point_size * row);while (row--){array[row] = (T *)((long)head + row * col * size);}}return (T **)array;}void DelArray2D(void **array){if (array != NULL){#ifdef _WIN32if (hHeap){::HeapFree(hHeap, HEAP_NO_SERIALIZE, array);}#elsedelete array;#endif}}int main(){//TRACE_OFF();//MEM_ON();std::cout << "动态申请二维数组" << std::endl;std::cout << "请输入行列(以空格分开): " << std::endl;int row, col;std::cin >> row;std::cin >> col;//动态申请连续的二维数组 int **p = NewArray2D<int>(row, col);// 为二维数组赋值int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){p[i][j] = i + j;}}// 输出二维数组for (i = 0; i < row; i++){for (j = 0; j < col; j++){std::cout << p[i][j] << " ";}std::cout  << std::endl;}DelArray2D((void **)p);//MEM_OFF();return 0;}


原创粉丝点击