动态二维数组如何定义?

vcshox 2002-10-26 05:31:51
我在程序中需要使用一个动态的二维数组,行和列的值都需要传入。我在程序中使用了如下的方法:
#include "malloc.h"
...
double *t,**y;
t=(double *)calloc(r*c,sizeof(double)); //r,c是传入的行和列的值
y=(double **)calloc(r,sizeof(double *));
for(int i=0;i<r;i++) y[i]=&t[c*i];
...
结果在编译时没有问题,但运行时就回产生一个内存使用错误。
希望大家能够帮忙解决一下,或者有其他的解决方法也可以。谢谢!
...全文
1219 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ColdWolf 2002-10-28
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"

void main(void)
{
int **piMatrix;
piMatrix = (int **) malloc (2*sizeof(int*));
for (int i=0; i<2; i ++)
piMatrix[i] = (int *) malloc(3*sizeof(int));

for (i=0; i < 2; i ++)
{
for (int j=0; j<3; j ++)
{
piMatrix[i][j] = i*10 + j;
printf("%2i ",piMatrix[i][j]);
}
cout << endl;
}
delete (piMatrix);
getchar();
}
ColdWolf 2002-10-28
  • 打赏
  • 举报
回复
对不起,我那个地方少了一个* ,应该是int *piMatrix;
ColdWolf 2002-10-28
  • 打赏
  • 举报
回复
一个二维数组,其实可以用一个一维指针来访问的。
如:int iMatrix[10][10];
int *piMatrix;
piMatrix = iMatrix; //数组名就是数组首地址
那么就有 *piMatrix[2*10+3] = iMatrix[2][3]
所以定义一个一维指针就可以了
int piMatrix;
piMatrix = (int*)malloc(r*c*sizeof(int));
for (i=0;i<r;i++)
for(j=0;j<c;j++)
piMatrix[i*r+j]
(当然,也可以定义一个2维数组,跟Kevin_qing()一样)
Kevin_qing 2002-10-27
  • 打赏
  • 举报
回复
另外还可以

int ** Int2DArray;

Int2DArray=new int*[lines];
for(int i=0;i<lines;i++)
Int2DArray[i]=new int[colum];

Kevin_qing 2002-10-27
  • 打赏
  • 举报
回复
用MFC的CArray模板为例,你也可以使用STL的vector等
做一个2维的动态int数组

typedef CArray<int,int> INTARRAY;
typedef CArray<INTARRAY,INTARRAY> Int2DArray;
once168 2002-10-27
  • 打赏
  • 举报
回复
你这里弄错了一个问题:
二维数组不会增加指针数,数据是连续的
解释:
如:array[n][m]
即每第array[n]虽是相当于一个指针(这个函义是编译器加的),但其实际上就是
array[n][0]的地址,并不是在array[n][0]中存方地址(你的方式就是这样)

当然类型仅仅是编译器的概念,只要强型转换就行了
如下:
typedef int array3[3];
array3 *p3;
int *pi=(int *)malloc(sizeof(int));
for(int i=0;i<9;i++)pi[i]=i;
p3=(array3 *)pi;//现在p3就可按二维数组的型式访问了

ostream_iterator<int,char> out(cout," ");
copy(p3[0],p3[0]+9,out);



vcPlayer 2002-10-26
  • 打赏
  • 举报
回复
int row, col;
double **p = NULL;
*p = new (double *)[row];
for(int i = 0; i < row; i++)
p[i] = new double[col];
dcyu 2002-10-26
  • 打赏
  • 举报
回复
最好把这个部分作成单独的子程序。加个return y.
coppermine 2002-10-26
  • 打赏
  • 举报
回复
可以这样使用二维数组:

假设前面已经定义了r行 和 c列

/*指向座标为(x,y)的单元的指针*/
#define M_pV(pHead, x, y) (pHead+c*y+x)

double *pArray=(double*)malloc(r*c*sizeof(double));

到时候可以这样用:
*M_pV(pArray, 1, 2)=9;
double temp=*M_pV(pArray, 1, 2);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧