C言語で2 D配列を動的に割り当てるにはどうすればいいですか?コードの例


以下に、スタック上に2 D配列(または2 D配列を動的に割り当てる)を作成する異なる方法を示します.
以下の例では,”[R’を行数とし,”C’を列数として,r=3,c=4および以下の値で2 D配列を作成した.
1  2  3  4
  5  6  7  8
  9  10 11 12

1)単一のポインタを使用する:
1つの簡単な方法は、簡単なポインタアルゴリズムを使用して、r*cサイズのメモリブロックとアクセス要素を割り当てることである.
#include 
#include 
  
int main()
{
     int r = 3, c = 4;
     int *arr = ( int *) malloc (r * c * sizeof ( int ));
  
     int i, j, count = 0;
     for (i = 0; i <  r; i++)
       for (j = 0; j < c; j++)
          *(arr + i*c + j) = ++count;
  
     for (i = 0; i <  r; i++)
       for (j = 0; j < c; j++)
          printf ( "%d " , *(arr + i*c + j));
  
    /* Code for further processing and free the 
       dynamically allocated memory */
    
    return 0;
}

出力は次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12

2)ポインタ配列の使用
rサイズのポインタ配列を作成できます.C 99からC言語では可変サイズの配列を使用できます.ポインタ配列を作成すると、各行にメモリを動的に割り当てることができます.
#include 
#include 
  
int main()
{
     int r = 3, c = 4, i, j, count;
  
     int *arr[r];
     for (i=0; i

出力は次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12

3)ポインタを指すポインタの使用
また、2つのポインタを使用してポインタ配列を動的に作成することもできます.配列ポインタを動的に割り当てると、メソッド2のように各行にメモリを動的に割り当てることができます.
#include 
#include 
  
int main()
{
     int r = 3, c = 4, i, j, count;
  
     int **arr = ( int **) malloc (r * sizeof ( int *));
     for (i=0; i

出力は次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12

4)二重ポインタとmalloc呼び出しを使用
#include
#include
  
int main()
{
     int r=3, c=4, len=0;
     int *ptr, **arr;
     int count = 0, i, j;
  
     len = sizeof ( int *) * r + sizeof ( int ) * c * r;
     arr = ( int **) malloc (len);
  
     // ptr is now pointing to the first element in of 2D array
     ptr = ( int *)(arr + r);
  
     // for loop to point rows pointer to appropriate location in 2D array
     for (i = 0; i < r; i++)
         arr[i] = (ptr + c * i);
  
     for (i = 0; i < r; i++)
         for (j = 0; j < c; j++)
             arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count
  
     for (i = 0; i < r; i++)
         for (j = 0; j < c; j++)
             printf ( "%d " , arr[i][j]);
  
     return 0;
}

出力は次のとおりです.
1 2 3 4 5 6 7 8 9 10 11 12

不正な点が見つかったり、上記のトピックに関する詳細を共有したい場合は、コメントを発表してください.
その他のC言語に関する内容は、lsbin-IT開発技術:https://www.lsbin.com/
以下のC言語の詳細を表示します.
  • C言語exec関数ファミリー : https://www.lsbin.com/3438.html
  • C言語externキーワード通俗解釈 : https://www.lsbin.com/2950.html
  • C言語のscansetは何ですか? : https://www.lsbin.com/2363.html