c++-C++三维数组的动态申请

问题描述

C++三维数组的动态申请

我想动态申请一个三维数组,但是一定要使得存储的空间连续的,方便管理,不知道各位有什么看法。
有个一二维的例子可以参考:
A **ga= new A* [m];
ga[0] = new A [m*n];
for(int i=1;i<m;++i)
{
ga[i]=ga[i-1]+n;
}
那么这样的内存便是一整块方便管理的了,那么三维情况又如何呢?

解决方案

申请一维数组,构造3维数组的指针来访问

解决方案二:

申请一维数组,构造3维数组的指针来访问

解决方案三:

//多维数组开空间
#if 1
#include
#include

void print3Dmatrix(int D3_num,int n,int m, int l) //以D3_num形式将D3_num的首地址传入
{
int i,ii,iii;
printf("
3D matrix is:
");
for (i=0;i<n;i++){
printf("[]
",i);
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D3_num[i][ii][iii]);
        }
        printf("
");
    }
}

}

int **D3ToD2(int ***D3_num) //int **表示返回的是一个二级指针
{
int **D2_num;
D2_num=D3_num[0];//D3_num是一个三级指针,D3num[0]是一个二级指针,D3num[0][0]是一个一级指针
return D2_num;
}

void print2Dmatrix(int **D2_num,int m, int l)
{
int ii,iii;
printf("
2D matrix is:
");
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D2_num[ii][iii]);
        }
        printf("
");
    }

}

int main()
{
int i,ii,iii;//初始化参数
int n=2,m=3,l=4; //三维数组长度

int ***D3_num;    //声明一个三级指针
D3_num=(int***)malloc(n*sizeof(int**));    //分配空间,该三级指针指向n个二级指针
for (i=0;i<n;i++){
    D3_num[i]=(int**)malloc(m*sizeof(int*));//分配空间,每个二级指针又指向m个一级指针
    for (ii=0;ii<m;ii++){
        D3_num[i][ii]=(int*)malloc(l*sizeof(int));//分配空间,每个一级指针指向长度为l的一维数组
        for (iii=0;iii<l;iii++){
            D3_num[i][ii][iii]=(i+1)*(ii+2)*(iii+3);//为每个数组赋值,这里D3_num[i][ii][iii]的形式与我们平常用三维数组的形式一致
            //但实际D3_num[i][ii][iii]是一种简写,C编译器解释起来是 *(*(*(p+i)+ii)+iii),所以可以直接赋值
        }
    }
}

print3Dmatrix(D3_num,n,m,l);//输出D3_num内容,这里直接将D3_num作为三级指针输入

int **D2_num; //三级指针可以表示三维数组,二级指针自然就表示二维数组了:D
D2_num=D3ToD2(D3_num);//D3ToD2返回一个二级指针,与D2_num匹配

print2Dmatrix(D2_num,m,l);
getchar();
return 0;

}
#endif

建议看下我这个例子。

解决方案四:

//多维数组开空间
#if 1
#include
#include

void print3Dmatrix(int D3_num,int n,int m, int l) //以D3_num形式将D3_num的首地址传入
{
int i,ii,iii;
printf("
3D matrix is:
");
for (i=0;i<n;i++){
printf("[]
",i);
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D3_num[i][ii][iii]);
        }
        printf("
");
    }
}

}

int **D3ToD2(int ***D3_num) //int **表示返回的是一个二级指针
{
int **D2_num;
D2_num=D3_num[0];//D3_num是一个三级指针,D3num[0]是一个二级指针,D3num[0][0]是一个一级指针
return D2_num;
}

void print2Dmatrix(int **D2_num,int m, int l)
{
int ii,iii;
printf("
2D matrix is:
");
for (ii=0;ii<m;ii++){

        for (iii=0;iii<l;iii++){
            printf("%.3d ",D2_num[ii][iii]);
        }
        printf("
");
    }

}

int main()
{
int i,ii,iii;//初始化参数
int n=2,m=3,l=4; //三维数组长度

int ***D3_num;    //声明一个三级指针
D3_num=(int***)malloc(n*sizeof(int**));    //分配空间,该三级指针指向n个二级指针
for (i=0;i<n;i++){
    D3_num[i]=(int**)malloc(m*sizeof(int*));//分配空间,每个二级指针又指向m个一级指针
    for (ii=0;ii<m;ii++){
        D3_num[i][ii]=(int*)malloc(l*sizeof(int));//分配空间,每个一级指针指向长度为l的一维数组
        for (iii=0;iii<l;iii++){
            D3_num[i][ii][iii]=(i+1)*(ii+2)*(iii+3);//为每个数组赋值,这里D3_num[i][ii][iii]的形式与我们平常用三维数组的形式一致
            //但实际D3_num[i][ii][iii]是一种简写,C编译器解释起来是 *(*(*(p+i)+ii)+iii),所以可以直接赋值
        }
    }
}

print3Dmatrix(D3_num,n,m,l);//输出D3_num内容,这里直接将D3_num作为三级指针输入

int **D2_num; //三级指针可以表示三维数组,二级指针自然就表示二维数组了:D
D2_num=D3ToD2(D3_num);//D3ToD2返回一个二级指针,与D2_num匹配

print2Dmatrix(D2_num,m,l);
getchar();
return 0;

}
#endif

建议看下我这个例子。

解决方案五:

申请内存块, 定义宏

 int m, n, l;      //  三维数组个数
byte*  arrTri = new byte[m * n * l];
#define arrTri_p(a, b, c) (arrTri + a*m + b*n + c)
for(int a = 0; a < n; a++)
for(int b = 0; b < m; b++)
for(int c = 0; c < l; c++)
   *arrTri_p(a, b, c) = 10;

解决方案六:

....
上面有点失误
#define arrTri_p(a, b, c) (arrTri + a*n*l + b*l + c)

解决方案七:

最好不要这么搞, 要是头被覆盖了, 这是很难受,问题很大的一件事情。

解决方案八:

//构建3维矩阵?
double*** data3d;//k是最外层(Z),i次外层(y),j是内层(x)?
data3d =new double**[volume_depth];??
for(int k=0; k<volume_depth; k++)??
{??
&nb......
答案就在这里:动态申请三维数组

时间: 2024-09-17 04:10:47

c++-C++三维数组的动态申请的相关文章

动态增长空间-java 数组空间动态增长问题

问题描述 java 数组空间动态增长问题 ReArrayList 类实现 ReList 接口,内部以数组的方式实现,因此我在ReArrayList定义了属性 ReArrayList[] ; 要求ReArrayList 类的add()方法往试图往 ReArrayList 中增加对象时,如果内部数组已满,则增加数组大小,增量为 incSize,增加数组大小用Arrays.copyOf()方法. 但是这个方法是返回一个新的数组,那我下面的其他方法却用的是原来的数组arrys,怎么解决呢? 解决方案 J

释放动态申请数组内存-C++中动态申请的数组内存异常时内存释放问题

问题描述 C++中动态申请的数组内存异常时内存释放问题 在C++的一个方法中动态申请了一段数组的内存,还未通过delete[] 语句释放这段内存,方法异常,此时代码不会执行后面的delete[] 语句了,那么前面申请的这段数组内存怎么释放? C++中的auto_prt只支持单个对象动态内存的管理,对于数组动态申请的内存怎么管理? 解决方案 应该在运行期系统自动帮你归还,前提是你的数组是由class构成,但不是内置类型.详见EFFECTIVE C++第三版条款52(写了placement new也

字符数组-C++动态创建不定长数组

问题描述 C++动态创建不定长数组 我想通过直接输入一个任意大小的字符串来创建一个字符数组,但又不想浪费多余的空间,要怎么做到呢?新手... 解决方案 char * newchar(const char * ps){ char * prt = 0; if(ps){ int nlen = strlen(ps); prt = new char[nlen+1]; strcpy(prt,ps); } return prt; } 解决方案二: 直接用指针,可以动态申请大小,且可以将指针当成数据来访问. 如

C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。

问题描述 C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪. 今天写了个样例程序,程序主要是动态创建一个类的对象,存入list链表中,然后再把链表中的对象delete掉回收内存,理论上并不应该会产生内存泄露,但是从现象上来看确实是发生了内存泄露.程序启动后我分别在"创建对象前"."创建对象后"."释放对象内存后"三个阶段使用命令ps -aux|grep a.out查看了程序使用内存情况,发现在"释放对象内存后&

编程c语言-c语言三维数组做函数输入变量,函数的形参怎么写?

问题描述 c语言三维数组做函数输入变量,函数的形参怎么写? 比如uint8_t cube[5][5][5];要在函数内处理数组内的数据并能返回值,肯定是传入三维数组的地址.函数定义时形参不知道怎么写才行??void process(uint8_t ????); 解决方案 用uint8_t * cube就可以了. 解决方案二: 需要用指针不然改的都是形参的临时内容,或者直接操作全局变量 解决方案三: 其实传入一个地址指针就可以实现数据同步了.*(&cube) 解决方案四: C语言:变量和函数引用的

结构-js 或 php 不定长数组怎样动态嵌套循环

问题描述 js 或 php 不定长数组怎样动态嵌套循环 类似这样结构的数组 :arrobj=[[arr1],[arr2],[arr3]];假如arrobj的长度不确定怎样能得到类似的循环: for(var key1 in arr1){ for(var key2 in arr2){ for(var key3 in arr3){ } } } 解决方案 for..in来循环就行了..你的这个结构只需要2层,下面是js的 <script> var arrobj = [[1, 2, 3, 4], [1]

二维数组-新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点

问题描述 新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点 Description 给出一个长方体,求该长方体每个正切面上的元素之和的最大值. 正切面的意思就是与长方体某一面平行的切面.如果把长方体看作是一个三维数组,那么每个切面就是一个二维数组. Input 第一行是3个正整数a.b.c,分别表示长方体的长.宽.高.0 < a, b, c ≤ 60 接下来是 c 块数据,每一块数据有a行.每行b个整数. Output 输出切面元素和的最大值. Sample

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h>   void main(void) {     int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节     {         printf("\n%p,%d", p, *p);    

游戏-如何解决C中用srand动态申请矩阵迷宫时很少有出路的问题?

问题描述 如何解决C中用srand动态申请矩阵迷宫时很少有出路的问题? 大二菜鸟新手一枚,数据结构实验需要完成迷宫,不会做MFC中的迷宫小游戏,退而求次 解决方案 用 srand 只能去生成随机方向,从8个方向中随机选一个为 0(我用0表示能通),其他位置可以是任意随机数,再以此类推, 产生的迷宫至少有一条通路.如果直接用生成的随机数构造矩阵,当然不能确保它能走通啦 解决方案二: 如何从8个方向中随机选择一个方向为0?