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

本文详细介绍了C++中二维数组的动态内存分配与释放方法,包括使用new和HeapAlloc,以及如何处理二维字符串数组的情况。此外,提供了一个模板函数NewArray2D用于简化二维数组的内存操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实大部分还是引用的http://blog.youkuaiyun.com/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 _WIN32
HANDLE hHeap;
#endif
template<typename T>
T** NewArray2D(int row, int col)
{
	int size = sizeof(T);
	int point_size = sizeof(T *);

	// 先申请内存,其中point_size * row表示存放row个行指针
#ifdef _WIN32
	hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
	T **array = (T **)(::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 ));
#else
	T **array = new T * [point_size * row + size * row * col];
#endif

	if (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 _WIN32
		if (hHeap)
		{
			::HeapFree(hHeap, HEAP_NO_SERIALIZE, array);
		}
#else
		delete 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值