-7

どのようにしてメモリをアレイに動的に(2D)割り当てることができますか?ダイナミックに割り当てられた配列をC言語で作成するには

int arr[n]; 

多かれ少なかれメモリが必要な場合は、動的割り当てがより適しています.Cでどのように行うことができますか?

int **arr; 
arr = malloc(r*sizeof(int*)); 
for(int i=0; i < r; i++) 
{ 
    arr[i] = malloc(c*sizeof(int)); 
} 

これは、動的に整数へのポインタの配列を割り当て、その後の配列を割り当てます。あなたがこれを行うことができ、あなたは行数「R」と列「C」の数を持っていると仮定すると

+0

https://www.google.com/search?q=c+dynamic+配列 – Biffen

+1

あなたは['malloc'](http://en.cppreference.com/w/c/memory/malloc)と[' free'](http://en.cppreference.com/w/c)について聞いたことがありますか? /メモリ/無料)? –

答えて

2

各ポインタへの整数

for(int i=0; i < r; i++) 
{ 
    free(arr[i]); 
} 
free(arr); 
+0

これは "1"の配列ではなく、 "1 + rows * columns"の配列です。 – alk

+0

これはCの動作方法であり、 "1つの2D配列"を動的に割り当てることはできません。静的に割り当てられた2D配列(mxn)は、実際には長さm * nの1D配列として割り当てられているため、arr [i] [j]のような配列にアクセスするとメモリ位置[i * n + j]にアクセスします。コンパイラは、配列が動的に割り当てられているときに「n」を認識しません.Arr [i] [j] –

+0

"*として動的にアクセスできない場合は、配列として割り当てることはできません1つの2D配列 "*"を割り当てることができます! :-)あなたは私の答えを見たいかもしれません。 – alk

1

それを配列へのポインタを定義して、多くのメモリとして割り当て:あなたが最初の整数配列を削除する必要があり、その後、ポインタ配列は、このような場合には、設定が完了したときに動的に割り当てられた配列を削除することを忘れないでください。使用中のCの実装が1のVLAを交互に行うことができますサポートしている場合

#include <stdlib.h> 
#include <stdio.h> 


#define ROWS (5) 
#define COLUMNS (7) 


int main(void) 
{ 
    /* Define and initialise the pointer to the array. */ 
    int (*p)[ROWS][COLUMNS] = malloc(sizeof *p); 

    if (NULL == p) 
    { 
    perror("malloc() failed"); 
    return EXIT_FAILURE; 
    } 

    /* Initialize the array's members. */ 
    { 
    size_t r, c; 

    for (r = 0; r < ROWS; ++r) 
    { 
     for (c = 0; c < COLUMNS; ++c) 
     { 
     (*p)[r][c] = r * c; 
     } 
    } 
    } 

    /* Print the array's members' values. */ 
    { 
    size_t r, c; 

    for (r = 0; r < ROWS; ++r) 
    { 
     for (c = 0; c < COLUMNS; ++c) 
     { 
     printf("array[%zu][%zu] = %d\n", r, c (*p)[r][c]); 
     } 
    } 
    } 

    /* Free the array. */ 

    free(p) 

    return EXIT_SUCCESS; 
} 

:を指すように定義されて

#include <stdlib.h> 
#include <stdio.h> 


int main(void) 
{ 
    size_t ROWS = 5; 
    size_t COLUMNS = 7; 

    ...