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()
相似回答