Advertisement
Guest User

Dynamic 2D array example

a guest
Nov 25th, 2021
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h> //  malloc free
  3. #include <string.h> //  memset
  4.  
  5. //-------------------------------------------------------------------
  6. //  Объект двумерный массив
  7. struct  LONG_2D
  8. {
  9.     long**  array;
  10.     long*   buf;
  11.     size_t  width;  //  Ширина
  12.     size_t  height; //  Высота
  13. };
  14. //-------------------------------------------------------------------
  15.  
  16. //-------------------------------------------------------------------
  17. //  Прототипы функций
  18. //-------------------------------------------------------------------
  19. //  Функция создает двумерный массив заданного размера
  20. //  w - ширина
  21. //  h - высота
  22. //  Возвращает указатель на выделенный массив или NULL при неудаче
  23. long**  alloc_2d_array( struct LONG_2D* la, size_t w, size_t h );
  24. //  Функция освободжает память, выделенную под массив
  25. void    free_2d_array( struct LONG_2D* la );
  26. //  Функция выводит содержимое двухмерного массива на экран
  27. void    show_2d_array( struct LONG_2D* la );
  28. //-------------------------------------------------------------------
  29.  
  30. int main( int argc, char* argv[] )
  31. {
  32.     struct  LONG_2D ar_obj;
  33.     long**  ar;
  34.     //  координаты в массиве
  35.     size_t  x;
  36.     size_t  y;
  37.     //  Размер массива
  38.     size_t  width = 3;  //  Ширина
  39.     size_t  height = 4; //  Высота
  40.     long    count = 0;
  41.  
  42.     printf( "Динамический двумерный массив размером %lux%lu\n",
  43.             width, height );
  44.  
  45.     //  Породим массив 3 на 4 элемента
  46.     ar = alloc_2d_array( &ar_obj, 3, 4 );
  47.     if( ar )
  48.     {
  49.         //  Проинициализируем массив
  50.         for( y = 0; y < height; y++ )
  51.         {
  52.             for( x = 0; x < width; x++ )
  53.             {
  54.                 ar[y][x] = count;
  55.                 count++;
  56.             }
  57.         }
  58.  
  59.         //  Выведем массив на экран
  60.         show_2d_array( &ar_obj );
  61.         //  Освободим выделенную память
  62.         free_2d_array( &ar_obj );
  63.     }
  64.     else
  65.     {
  66.         perror( "malloc" );
  67.     }
  68.  
  69.     return  0;
  70. }
  71. //-------------------------------------------------------------------
  72. //  Функция создает двумерный массив заданного размера
  73. //  w - ширина
  74. //  h - высота
  75. //  Возвращает указатель на выделенный массив или NULL при неудаче
  76. long**  alloc_2d_array( struct LONG_2D* la, size_t w, size_t h )
  77. {
  78.     size_t  col;    //  Столбец
  79.  
  80.     //  Очистим объект от мусора
  81.     memset( la, 0, sizeof(struct LONG_2D) );
  82.     //  Выделим кусок памяти под буфер для массива
  83.     la -> buf = (long*)malloc( w * h * sizeof(long) );
  84.     //  Если выделение прошло успешно, то продолжим
  85.     if( la -> buf )
  86.     {
  87.         //  Сохраним размер двухмерного массива
  88.         la -> width = w;
  89.         la -> height = h;
  90.         //  Очистим буфер от мусора
  91.         memset( la->buf, 0, w * h * sizeof(long ) );
  92.  
  93.         //  Выделим память под массив указателей
  94.         la -> array = (long**)malloc( h * sizeof(long*) );
  95.         //  Проинициализируем массив указателями на
  96.         //  начало строк в буфере
  97.         if( la -> array )
  98.         {
  99.             for( col = 0; col < h; col++ )
  100.             {
  101.                 //  Сохраним указатель на столбец
  102.                 la->array[ col ] = &la->buf[ col*w ];
  103.             }
  104.         }
  105.         else
  106.         {
  107.             free( la-> buf );
  108.             la -> buf = NULL;
  109.         }
  110.     }
  111.  
  112.     return  la -> array;
  113. }
  114. //-------------------------------------------------------------------
  115. //  Функция освободжает память, выделенную под массив
  116. void    free_2d_array( struct LONG_2D* la )
  117. {
  118.     if( la -> array )
  119.     {
  120.         free( la->array );
  121.         la -> array = NULL;
  122.     }
  123.     if( la->buf )
  124.     {
  125.         free( la->buf );
  126.         la -> buf = NULL;
  127.     }
  128. }
  129. //-------------------------------------------------------------------
  130. //  Функция выводит содержимое двухмерного массива на экран
  131. void    show_2d_array( struct LONG_2D* la )
  132. {
  133.     long    row;    //  Строка
  134.     long    col;    //  Столбец
  135.     for( row = 0; row < la -> height; row++ )
  136.     {
  137.         for( col = 0; col < la -> width; col++ )
  138.         {
  139.             printf( "%ld", la->array[row][col] );
  140.             if( col < la -> width - 1 )
  141.             {
  142.                 printf( "\t" );
  143.             }
  144.             else
  145.             {
  146.                 printf( "\n" );
  147.             }
  148.         }
  149.     }
  150. }
  151. //-------------------------------------------------------------------
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement