|
2次元配列のメモリーを確保した後に、その領域が足りなく
なって再確保するときの方法がよくわかりません。realloc
をするときのアドレスがあやしいのかな?ポインタについて
あまりわかってないってことですね。とりあえず書いたプロ
グラムを誰か見てください。よろしくお願いします。
main(){
void TEST(int **list,int **f);
int ** create_array(int row, int rank);
int ** create_array(int row, int rank);
int **f,**list;
int i,j;
FILE *fp1;
if((fp1=fopen("testmalloc.txt","w"))==NULL){
printf("%s file not open!\n");
exit(0);
}
f=create_array(2,5);
list=f;
TEST(list,f);
for(i=0;i<2;i++){
for(j=0;j<10;j++){
fprintf(fp1,"list[%d][%d]=%d\n",i,j,list[i][j]);
}
}
free(f);
fclose(fp1);
return(0);
}
/*------------------メモリー確保-----------------*/
/*---------2次元配列 行row 列rank ------------*/
int ** create_array(int row, int rank)
{
int i;
int **a1;
int *ptr1;
a1=(int **)malloc(row*sizeof(int *));
if(a1==NULL){
perror("malloc:");
fprintf(stderr,"memory allocation error\n");
exit(1);
}
ptr1=(int *)malloc(row*rank*sizeof(int));
if(ptr1==NULL){
perror("malloc:");
fprintf(stderr,"memory allocation error\n");
exit(1);
}
for(i=0;i<row;i++){
a1[i]=ptr1+i*rank;
}
return(a1);
}
/*---------------メモリー再確保-----------------*/
/*----------------行row、列rank-----------------*/
int ** re_array(int **a2,int row, int rank)
{
int i;
int *ptr2;
ptr2=(int *)realloc(*a2,row*rank*sizeof(int));
if(ptr2==NULL){
perror("remalloc:");
fprintf(stderr,"memory reallocation error\n");
exit(1);
}
for(i=0;i<row;i++){
a2[i]=ptr2+i*rank;
}
return(a2);
}
/*------------------------------------------------------*/
void TEST(int **LIST,int **F)
{
int i,j,p,n;
p=0;
n=0;
for(i=0;i<2;i++){
for(j=0;j<10;j++){ //はじめlist[2][5]の大きさしかなかったが
LIST[i][j]=n; //list[2][10]必要になってlist[2][15]
n++; //再確保する。
if(j==4+p*10){
F=re_array(F,2,5+p*10);
LIST=F;
p++;
}
}
}
}
ねらった実行結果はlist[0][0]〜list[0][9]=0,1,2…9
list[1][0]〜list[1][9]=10,11…19
|