能否定义这样一个函数,以一个整数为变量,以一个数组为返回值?
这个数组的维数大小是与变量有关的。比如说我们要定义这样的一个函数f,它以一个long int型的变量number为形参,以这个number的各个数位上的数字依次组成的数组为返回值。这个能够实现吗?尤其是,当这个数组的维数大小是不能预先得知的情况下。
如果可以的话,在C中是怎么样实现的,而在C++中又是怎么实现的? 函数 返回值 数组
[解决办法]
需要多大的内存就申请多大的内存,返回指向该内存的指针
c用malloc
c++用new,还可以用std::vector
[解决办法]
运行时才能知道维数和大小的数组必须使用指针动态创建
[解决办法]
1、先定义个足够大的数组
2、可以得到各位上的数,按次序存放到数组中
3、再根据实际数组大小,分配空间,返回即可
===============================
没有做不到只有想不到
[解决办法]
为什么不能?只是调用者必须负责释放返回的指针,否则会造成内存泄漏
vector之类的封装类,事实上本质都是指针,只是类代码把你和指针隔离开,代码负责指针的申请、释放、增长缩小等操作
[解决办法]
无论几维的数组,实质上都是内存中一个连续的区域,计算机里面是没有多维的概念的,你这里可以返回一个数据内存的指针,然后使用输出变量返回根据number计算得到的维数信息,然后就封装一个函数进行多维数组的访问就可以了。
char* f(int number, int** dimension, int* dimension_len)
{
char* b = new char[number];
// 计算得到是3维,则
*dimension_len = 3;
*dimension = new int[*dimension_len];
// 填充dimension数组
return b;
}
char get_data(char * buffer, int *dimension, int x, int y, int z)
{
return buffer[(dimension[1]*dimension[2])*x + dimension[2]*y + z];
}
int main()
{
int * dimension;
int dimension_len;
char* buff = f(number, &dimension, &dimension_len);
char data = get_data(buff, dimension, 1, 0, 0);
delete [] buff;
delete [] dimension;
return 0;
}
大概就是这样了
[解决办法]
参考以下代码,改为递归即可实现动态数组维数:
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
p=(int ***)malloc(3*sizeof(int **));
if (NULL==p) return;
for (i=0;i<3;i++) {
p[i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[i]) return;
for (j=0;j<4;j++) {
p[i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[i][j]) return;
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[i][j][k]=i*20+j*5+k;
}
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %2d",p[i][j][k]);
}
printf("\n");
}
printf("---------------\n");
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[i][j]);
}
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------
//在堆中开辟一个2×3×4×5的4维int数组
#include <stdio.h>
#include <malloc.h>
int ****p;
int h,i,j,k;
void main() {
p=(int ****)malloc(2*sizeof(int ***));
if (NULL==p) return;
for (h=0;h<2;h++) {
p[h]=(int ***)malloc(3*sizeof(int **));
if (NULL==p[h]) return;
for (i=0;i<3;i++) {
p[h][i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[h][i]) return;
for (j=0;j<4;j++) {
p[h][i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[h][i][j]) return;
}
}
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[h][i][j][k]=h*60+i*20+j*5+k;
}
}
}
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %3d",p[h][i][j][k]);
}
printf("\n");
}
printf("--------------------\n");
}
printf("=======================\n");
}
for (h=0;h<2;h++) {
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[h][i][j]);
}
free(p[h][i]);
}
free(p[h]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//--------------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//--------------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//--------------------
//=======================
// 60 61 62 63 64
// 65 66 67 68 69
// 70 71 72 73 74
// 75 76 77 78 79
//--------------------
// 80 81 82 83 84
// 85 86 87 88 89
// 90 91 92 93 94
// 95 96 97 98 99
//--------------------
// 100 101 102 103 104
// 105 106 107 108 109
// 110 111 112 113 114
// 115 116 117 118 119
//--------------------
//=======================
//
[解决办法]
返回的是指针吧 ,另形参传进去后,就可以算出位数吧,再来分配