动态申请三维数组

本文探讨了如何使用三维指针动态申请三维数组,并通过分析程序中的错误来深入理解指针运算。作者通过示例解释了二维数组如何通过指针表示,并展示了在遍历三维数组时的指针操作。在动态分配和释放内存的过程中,强调了正确计算指针偏移的重要性,以避免段错误。

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

看了多维数组和多维指针的 知识 ,就动手写下  一些 bug 方便以后复习。

这是下linux 下用gcc 编译的程序:
#include<stdio.h>
#include<malloc.h>
int*** dy3d(int high,int row,int colu)
{
	int i, j;

	int ***p1=(int***)malloc(sizeof(int**)*high);
	int **p2=(int**)malloc(sizeof(int*)*row*high);
	int *p3=(int*)malloc(sizeof(int)*high*row*colu);
	 //p=temp;

	for(i=0;i<high;i++)	
	{
	    //*(p1+i)=(p2+row*colu*i);
	    *(p1+i)=(p2+row*i);
	    for(j=0;j<row;j++)
	    {
		*(*(p1+i)+j)=(p3+colu*i);
		//*(p2+j)=(p3+colu*i);
	    }
	}
	
	return p1;
}

void free3d(int***p)
{
	if(**p!=NULL)
	{
		free(**p);	
		printf("free3\n");
	}
	if(*p!=NULL)
	{
		free(*p);	
		printf("free2\n");
	}
	free(p);
	printf("free1\n");
	return ;
}
int main()
{
	int ***p;
	int i,j,k;
	p=dy3d(50,3,3);
	for(k=0;k<50;k++)
	{
		   for(i=0; i<3; i++)
		  {
		      for(j=0; j<3; j++)
		      {
		          printf("%d, ", p[k][i][j]);
		      }
		      
		     // printf("\n");
		  }
			 printf("\n");
	}
	printf("sizeof(int**)==%d\n",sizeof(int**));
	free3d(p);
	return 0;
}

分析一下上面的程序: 这个程序也不是一下就写成的 中间写的版本 运行是会出现断错误 所以 还是记录一下下1.为什么会想到用三维指针呢因为二维数组 的表示可以用可以 二维指针表示:例二维数组的数组名可以看做是 指针常量 其指向的类型是 类型相同的一维数组int a[3][3] 在遍历的时候用 for 循环 可以写作 :*( *(a+i)+j )==a[i][j] --->这里解释一下等式左边 *(a+i) ---->得到的是一维数组的数组名(一维数组的数组名也可以看做 指针常量)--指针运算---> *(a+i)+j-->得到的还是地址*( *(a+i)+j )-- 获取一维数组里面的值这样看三维数组就应该是这样的:int a[1][2][3] 遍历的时候:

*(*( *(a+i)+j) +k) *(a+i) ---->得到的是2维数组的数组名(2维数组的数组名也可以看做 指针常量)--指针运算---> *(a+i)+j-->得到的还是地址*( *(a+i)+j )-- 获取2维数组里面的值即一维数组的数组名----->*(*( *(a+i)+j) +k) 得到一维数组里的值这么看的话自然应该用三维指针 。2.看到free3d(int***p)这个函数 ,参数只有一个三维指针,所以该三维指针的每一层都应该被赋予 恰当的值=====>指向合适的内出地址所以就能看到在 dy3d() 这个函数里,p1 每一层 都指向合适的由malloc申请的地址空间在写 *(p1+i)=(p2+row*i); 这个语句的时候有点疑惑 到底是用 *(p1+i)=(p2+row*colu*i); or *(p1+i)=(p2+row*i); 运行程序都是正常的,并不会出现段错误----------哎 这就疑惑了-------解惑:指针运算:(p2+row*colu*i) 和 (p2+row*i) 都是指针运算当三维数组的 (p1+i) 其实是指向 下一个同类型的二维数组 (p2+row*i) 动态申请的时候 有多少个同类型的2维数组 是row*high 所以row*i 就是第i个二维数值的地址值 --不会超过 2维指针申请的空间(p2+row*colu*i) 而这个值 是我单纯的想到了 指针的跨度====忽略了 p2的指针类型 ==这个值也会明显操出 所申请的二维指针区域

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值