2016-09-09 8 views

答えて

1
double **twod = malloc(20 * sizeof(double *)); 
int i; 
if (twod == NULL) 
    abort(); 

for (i = 0; i < 20; ++i) 
    if ((twod[i] = malloc(100000 * sizeof(double))) == NULL) 
     abort(); 

// clean up 
for (i = 0; i < 20; ++i) 
    free(twod[i]); 
free(twod); 

最初mallocコールは20のdoubleポインタのためのスペースを割り当てます。各doubleポインタはサブアレイを指します。

ループ内の2番目のmallocコールは、各サブアレイに100000 doubleを割り当てます。

freeの呼び出しは、mallocの逆を行います。メモリをフリーストアに返します。まず、ループ内で各サブアレイを解放する必要があります。その後、配列自体も解放する必要があります。

戻り値mallocNULLに対して調べます。 mallocNULLを返した場合、システムのメモリは不足しています。これは、大量のメモリを割り当てるので重要です。 mallocNULLを返した場合、アプリケーションはアボートされます。

1

あなたは、ポインタへのポインタを定義し、このようにそれを初期化する必要があります:

int i; 
double **array; 
array = malloc(sizeof(double *)) * 20); 
for (i=0; i<20; i++) { 
    array[i] = malloc(sizeof(double) * 100000); 
} 

あなたはそれで終わったときにメモリをfreeすることを忘れないでください。

0

あなたは断片化を避けるために、Variable-length array(C99以降)を使用することができます。

double (*array)[cols]; 

array = malloc(sizeof(*array) * rows); 

このようにfree(array);を呼んで十分です。

関連する問題