c语言动态二维数组分配子函数,在主函数中无法正常访问

#include <stdio.h>
#include <stdlib.h>
#define FALSE -1

/*动态分配二维数组,即row*column的矩阵 */
int MatrixDynAllot(int row, int column, double **pArray )
{
int ncount, i, j;
void **ptdhead;
void **ptdBody;

ptdhead = (void **)malloc(sizeof(void*)*row + sizeof(double)*row*column);
if(!ptdhead)
{
return FALSE;
}
ptdBody = ptdhead + row;
for(ncount = 0; ncount < row; ncount++)
ptdhead[ncount] = ptdBody + ncount * column * sizeof(double)/sizeof(void*);
pArray = (double **)ptdhead;
ptdhead = NULL;
for(i = 0; i < row; i++ )
{
for(j = 0; j< column; j++)
{
pArray[i][j] = 0;
}
}
return 0;
}

int main()
{
int i, j;
int row, column;
double **pArray;
row = 5;
column = 8;
MatrixDynAllot( row, column, pArray);
for( i = 0; i<row; i++)
{
for( j= 0; j<column; j++ )
{
printf("\n%f",pArray[i][i]);
}
}
}
请问应如何修改呢(建立一个 通用的、独立的 二维数组动态分配子函数,不采用全局变量)? 谢谢大家哈!

这肯定访问不了啊。。 你得清楚, 任何语法都得遵循一些基本原则,不可能凭空变出魔术来。。

c语言里本质上说,任何传递都是传值(忘记谭浩强C吧。。), 你传一个pArray进去相当于给他一个没初始化过的地址, 这有什么用? 然后在里面你给那个形式参数赋值。 这当然也没什么用, 形式参数的改变跟实际参数本身无关
如果你想传信息出来, 你必须传进去一个有效的指针, 这样函数里可以根据这个有效的指针的值(也就是有效的指针指向的内存地址),把回传的数据填写到这个地址, 这样函数调用结束后, 调用函数可以根据这个指针的值,到这个地址去找你传出来的东西。

解决方法就是把分配后的地址return回来啊。
double ** MatrixDynAllot(int row, int column )
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-04-18
把pArray设为全局量,动态分配。不用时再取消分配的单元。

#include <stdio.h>

double **pArray;

int MatrixDynAllot(int row, int column )
{
int i,j;
pArray = (double **) malloc(sizeof(double *) * row);
for (j=0;j<row;j++){
pArray[j] = (double *) malloc(sizeof(double) * column);
}
if (!pArray){printf("no enough memory....\n");};
for(i = 0; i < row; i++ )
{
for(j = 0; j< column; j++)
{
pArray[i][j] = 0;
}
}
return 0;
}

int main()
{
int i, j;
int row, column;
row = 5;
column = 8;
(void) MatrixDynAllot( row, column);

for( i = 0; i<row; i++)
{
for( j= 0; j<column; j++ )
{
printf("\n%lf",pArray[i][j]);
}
}
return 0;
}
第2个回答  2009-04-18
呵呵 我问你一句 你说主函数先运行还是子函数先运行呢
你动态不在主函数中申请 在子函数申请 却偏偏要主函数先运行 让未动态申请的二维数组当参数来用 违背了 先申请后使用原则
第3个回答  2009-04-17
我第一次看到。int 的 main()

...二维数组已经在主函数中用动态数组分配了空间。
难道在子函数中这个列就不管用了? 追答 如果用二维数组,以上用指针实现的过程中把维数设成变量就可以了,但是这样初始化时稍微有点儿麻烦。 还有一种做法,就是使用一维数组来存储二维数据的值,比如把int a[5][10]转换为int a[50],在读取时进行坐标转换,效果也是一样的,如:int getelement(int *a, int i,...

C语言动态分配二维数组问题
在第46行,的freep()这个函数没有见过……估计应该是free()吧。如果是free()那就不能放在这里,而是放在if(p){}的程序块中,否则会引起重复释放的错误。参考我下面的代码:...int main() {int **p = malloc2d(2, 2);int i = 0;int j = 0;if (p) {for (i = 0; i < 2;...

C语言中二维 动态 数组 作函数参数总是出错误?不用的话就运行正常
void T(int a[][10])void T(int (*a)[10])

C语言如何动态分配二维数组??
动态分配二维数组:void main(int argc, char * argv[]){ int NC=100, NR=200;int i,j;char **a; \/\/ a[NR][NC] -- *a[NR] -- a[j][i]a = (char **) malloc(sizeof(char *) * NR);for (j=0;j<NR;j++){ a[j] = (char *) malloc(sizeof(char) * NC);} \/...

c语言:怎样用malloc函数动态分配二维数组,使之可输入数组的行数和每行...
这个是可以的,但是和其他网友说的一样,内存是线性的,当你在语言中分配一个多维数组的时候,编译器其实也是分配线性内存的,但是我们可以通过模拟来实现类似数组的操作,下面演示一个分配以及操作数组的实例(列数要固定,这里假设列数为4):int _tmain(int argc, _TCHAR* argv[]){ int (*p)[4...

C语言中 为什么我在释放动态二维数组时会出现错误?
32位IP地址?但你只分配了32个字节。gets(a[i]);很可能是这句超出范围了,试试把空间分配多些

关于C语言的二维数组作为函数参数的问题?
int arr[n][m];实际上相当于:int n=2,m=3;int (*arr)[m];所以,传递二维数组作为参数,实际上就是传递了一个指针。将形参的类型定义成int*,再在函数内部转换回指向数组的指针就行了,比如:void f(int *p,int row,int column){ int (*arr)[column]=(int (*)[column])p;\/\/使用...

C语言 如何动态创建二维数组
这样的方法可行,不过要是题目要求输入m和n,然后再定义二维数组a[m][n],那就行不通了。你可以这样做:(以int型为例)int **a;int m,n,i;scanf("%d%d",&m,&n);a=(int**)malloc(m*sizeof(int*)); \/*malloc函数在stdlib.h里面,用的时候加入这个头文件*\/ for(i=0;i<m;i...

C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!
在子函数申请二维数组,主函数使用,可以用动态申请。方法不止一种,我这里用指针的指针实现二维数组。二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。include<stdio.h>#include<malloc.h>int ** sr(void){ int i,j; ...

C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!
在子函数申请二维数组,主函数使用,可以用动态申请。方法不止一种,我这里用指针的指针实现二维数组。二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。include<stdio.h>#include<malloc.h>int ** sr(void){ int i,j; ...

相似回答