动态申请三维数组

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

这是下linux 下用gcc 编译的程序:
#include
#include
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

分析一下上面的程序: 这个程序也不是一下就写成的 中间写的版本 运行是会出现断错误 所以 还是记录一下下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的指针类型 ==这个值也会明显操出 所申请的二维指针区域

你可能感兴趣的:(c)