C++中为二维指针动态分配内存的完整示例

山间有风
山间有风
发布时间:2026-10-15 | 5人浏览过
原创

在C++开发中,处理变长或大型二维数据时,常需使用二级指针进行动态内存管理。核心难点在于正确分配每一行的独立空间,并确保在程序结束前按相反顺序释放内存以防止泄漏。本文提供一段完整的标准示例代码,涵盖从初始化、赋值、输出到彻底清理的全过程。

二维指针内存分配原理

C++中的二维指针 int **p 本质上是一个指向指针的指针。为了模拟二维数组的行为,我们需要先分配一个包含 N 个 int* 类型元素的数组,随后为这 N 个指针分别分配包含 M 个 int 元素的数组。这种“锯齿状”或离散块式的分配方式使得每行的大小可以不同,但通常为了逻辑清晰,会分配成矩形结构。

完整实现步骤

第1步:定义常量与声明指针

首先定义行数 N 和列数 M,声明主指针 p 用于接收首地址,以及循环变量 i、j。

第2步:分配外层指针数组

使用 new int* [N] 分配存放指针的数组。此时 p 指向这块内存的首地址,但其中的每个指针元素(p[0] 到 p[N-1])都是未初始化的野指针,必须逐个处理。

第3步:分配内层实际数据区

遍历外层的每一个指针 p[i],使用 new int [M] 为其分配存储整型数据的连续内存块。至此,p[i][j] 的访问路径已完全打通。

第4步:数据填充与验证

通过双重循环向内存中写入数据。代码中演示了两种访问方式:
1. 标准的下标访问:p[i][j]
2. 纯指针运算访问:*(*(p + i) + j)
两者结果应一致,可用于验证指针操作的准确性。

第5步:规范释放内存

这是最易出错且导致内存泄漏的关键环节。释放顺序必须与分配顺序严格相反:
1. 先遍历释放每一行的小数组:delete [] p[i];
2. 将行指针置空:p[i] = NULL;
3. 最后释放外层指针数组本身:delete [] p;
4. 将主指针置空:p = NULL;

参考代码

#include <iostream>
using namespace std;

#define N 5
#define M 10

int main(int argc, char **argv)
{
	int **p;
	int i,j;

	// 1. 分配外层指针数组
	p = new int* [N];
	
	// 2. 为每个指针分配内层数据数组
	for (i = 0; i < N; i++)
		p[i] = new int [M];

	// 3. 填充数据
	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++)
			p[i][j] = i + j;

	// 4. 输出验证
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < M; j++)
		{
			cout<<"["<<p[i][j]<<"]"<<" ";
			cout<<*(*(p + i) + j)<<" "<<endl;
		}
		cout<<endl;
	}

	// 5. 释放内存(注意逆序)
	for (i = 0; i < N; i++)
	{
		delete [] p[i];
		p[i] = NULL;
	}
	delete [] p;
	p = NULL;

	return 0;
}

以上就是C++中二维指针动态分配内存的详细操作指南,更多关于C++内存管理与指针应用的知识请持续关注我们后续的文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表