Рубрики

Как динамически выделить 2D-массив в C?

Ниже приведены различные способы создания 2D-массива в куче (или динамического выделения 2D-массива).

В следующих примерах мы рассмотрели « r » как число строк, « c » как количество столбцов и создали двумерный массив с r = 3, c = 4 и следующими значениями

  1  2  3  4
  5  6  7  8
  9  10 11 12 

1) Использование одного указателя:
Простым способом является выделение блока памяти размером r * c и доступ к элементам с помощью простой арифметики указателей.

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

  

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));

  

   / * Код для дальнейшей обработки и освобождения

      динамически распределяемая память * /

    

   return 0;

}

Выход:

1 2 3 4 5 6 7 8 9 10 11 12

2) Использование массива указателей
Мы можем создать массив указателей размера r. Обратите внимание, что из C99 язык C позволяет использовать массивы переменного размера. После создания массива указателей мы можем динамически распределять память для каждой строки.

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

  

int main()

{

    int r = 3, c = 4, i, j, count;

  

    int *arr[r];

    for (i=0; i<r; i++)

         arr[i] = (int *)malloc(c * sizeof(int));

  

    // Обратите внимание, что arr [i] [j] совпадает с * (* (arr + i) + j)

    count = 0;

    for (i = 0; i <  r; i++)

      for (j = 0; j < c; j++)

         arr[i][j] = ++count; // Или * (* (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

3) Использование указателя на указатель
Мы можем динамически создавать массив указателей, используя двойной указатель. Как только у нас есть динамические указатели массива, мы можем динамически распределять память и для каждой строки, как метод 2.

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

  

int main()

{

    int r = 3, c = 4, i, j, count;

  

    int **arr = (int **)malloc(r * sizeof(int *));

    for (i=0; i<r; i++)

         arr[i] = (int *)malloc(c * sizeof(int));

  

    // Обратите внимание, что arr [i] [j] совпадает с * (* (arr + i) + j)

    count = 0;

    for (i = 0; i <  r; i++)

      for (j = 0; j < c; j++)

         arr[i][j] = ++count;  // ИЛИ * (* (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

4) Использование двойного указателя и одного вызова malloc

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

  

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 теперь указывает на первый элемент в 2D массиве

    ptr = (int *)(arr + r);

  

    // цикл для указателя строк на соответствующее место в 2D массиве

    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; // ИЛИ * (* (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

Спасибо Тришаншу Бхардваджу за предложение этого 4-го метода.

Эта статья предоставлена Абхай Рати . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

    Как динамически выделить 2D-массив в C?

    0.00 (0%) 0 votes