今日は二次配列(または一次)を動的に確保することに関して、お聞きしたい点があります。
動的に確保する、ということは、mallocを使うということになるのですが、これを関数を使って実現できないかと疑問に思っています。
つまり、
--------
~~~
int a[m][n];
~~~
--------
という記述を
--------
~~~
int **a;
makearray(m,n,a);//makearrayは自作の関数
~~~
--------
という様な書き方で実現できないか、ということです。
以下の試しに書いてみた、二次元配列を確保するコードでは、関数が3つありますが、main関数のforループの部分(正確にはa[j]の部分)でコアダンプが発生します。
#include<stdio.h>
#include<malloc.h>
/*配列を上書き*/
void print(int m,int n,double **a)
{
int i,j;
printf("--------------------------\n");
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
a[i][j]=1;
printf("%f\n",a[i][j]);
}
}
}
/*配列を動的に確保する関数*/
void makear(int m,int n,double **a)
{
int i,j;
/*********************/
a=malloc(sizeof(double *)*m);
for(i=0;i<m;i++)
{
a[i]=malloc(sizeof(double)*n);
}
/**********************/
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
a[i][j]=j;
printf("%f\n",a[i][j]);
}
}
print(m,n,a);
}
int main()
{
int m=5,n=4;
/*コメントで挟まれている部分を、a[m][n]という記述と同じ意味にしたい*/
/***********/
double **a;
makear(m,n,a);
/***********/
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
/*ここでコアダンプ*/
a[i][j]=j;
printf("%f\n",a[i][j]);
}
}
}