С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/193: Рейтинг темы: голосов - 193, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 260
Записей в блоге: 1

Как создать динамический двумерный массив

30.03.2016, 19:32. Показов 40412. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не знаю как объявить двумерный массив. Пытался так сделать не подходит
C++
1
float ** numbers = (float*) realloc (numbers, 2** sizeof(float));
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2016, 19:32
Ответы с готовыми решениями:

Как создать динамический двумерный массив и самому его заполнить?
Как создать динамический двумерный массив и самому его заполнить?

Используя malloc и realloc создать двумерный динамический массив
Используя malloc и realloc, помогите написать часть кода для ввода массива строк,количество строк и символов в строках неизвестно.

Создать двумерный динамический массив для переменных произвольного типа
это часть кода. сначала создал 2д массив для интов- все работало. но мне сказали сделать так чтобы принимало любые типы переменных. мне...

4
13 / 13 / 5
Регистрация: 02.01.2014
Сообщений: 60
30.03.2016, 22:51
C
1
2
3
4
5
6
7
8
9
10
11
12
    // Создадим квадратный массив размера size
    int size, i;
    int** array = (int**)malloc(sizeof(int*) * size);
    for(i = 0; i < size; i++)
        array[i] = (int*)malloc(sizeof(int*) * size);
 
//... Что-то поделаем с ним
 
    // Очистим память
    for(i = 0; i < size; i++)
        free(array[i]);
    free(array);
0
7 / 7 / 3
Регистрация: 22.09.2015
Сообщений: 173
08.05.2016, 23:54
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
 
 
int main() {
    int i, j;
    long long n, m;
    long long *ptr;
 
    scanf("%lld %lld", &n, &m);
 
    long long **array = (long long **) malloc(n * sizeof(long long*));
    for (i = 0; i < n; i++) {
        array[i] = (long long **) malloc(m * sizeof(long long*));
    }
 
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
//          Sto-to delaem
        }
    }
 
    for(i = 0; i < n; i++) {
        free(array[i]);
    }
    free(array);
 
return 0;
}
Почему у меня вылазит такое предупреждение?

C
1
2
warning: assignment from incompatible pointer type [enabled by default]
array[i] = (long long **) malloc(m * sizeof(long long*));
Добавлено через 2 часа 25 минут
Цитата Сообщение от Aliksan Посмотреть сообщение
long long **array = (long long **) malloc(n * sizeof(long long*)); for (i = 0; i < n; i++) { array[i] = (long long **) malloc(m * sizeof(long long*)); }
Сам же и нашел ошибку, так правильно:
C
1
2
3
4
    long long **array = (long long **) malloc(n * sizeof(long long*));
    for (i = 0; i < n; i++) {
        array[i] = (long long *) malloc(m * sizeof(long long));
    }
0
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 1
12.11.2020, 00:26
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main()
{
  int *a;  // указатель на массив
  int i, j, n, m;
  system("chcp 1251");
  system("cls");
  printf("Введите количество строк: ");
  scanf("%d", &n);
  printf("Введите количество столбцов: ");
  scanf("%d", &m);
  // Выделение памяти
  a = (int*)malloc(n*m * sizeof(int));
  // Ввод элементов массива
  for (i = 0; i<n; i++)  // цикл по строкам
  {
    for (j = 0; j<m; j++)  // цикл по столбцам
    {
      printf("a[%d][%d] = ", i, j);
      scanf("%d", (a + i*m + j));
    }
  }
  // Вывод элементов массива
  for (i = 0; i<n; i++)  // цикл по строкам
  {
    for (j = 0; j<m; j++)  // цикл по столбцам
    {
      printf("%5d ", *(a + i*m + j)); // 5 знакомест под элемент массива
    }
    printf("\n");
  }
  free(a);
  getchar();   getchar();
  return 0;
}
0
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
12.11.2020, 07:44
Aliksan, не совсем, malloc может вернуть NULL в случае, если память по каким-то причинам не была выделена, и ваша программа должна на это как-то реагировать, например:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
 
int main (void) {
    long long n, m;
    if (scanf("%lld%lld", &n, &m) != 2 || n < 1 || m < 1) {
        // если возникла ошибка ввода или размер намеренно был введен некорректно
        fprintf(stderr, "Wrong size!\n");   // сообщаем об ошибке
        return 1;       // выходим из программы с кодом ошибки
    }
 
    int **array = (int **) malloc(sizeof(int *) * n);
    if (array == NULL) {
        // если память не дали
        fprintf(stderr, "Error allocate memory!\n");
        return 2;
    }
 
    long long i;
    for (i = 0; i < n; i++) {
        array[i] = (int *) malloc(sizeof(int) * m);
        if (array[i] == NULL) {
            // если память не дали
            while (--i >= 0) {  // освобождаем всю память, которую успели занять
                free(array[i]);
            }
            free(array);
            fprintf(stderr, "Error allocate memory!\n");    // сообщаем об ошибке
            return 2;   // выходим из программы   с кодом ошибки
        }
    }
 
    // Теперь можно работать с массивом
    long long j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            array[i][j] = rand() %100;
            printf("%4d", array[i][j]);
        }
        puts("");
    }
 
    // освобождаем память и выходим
    for(i = 0; i < n; i++) {
        free(array[i]);
    }
    free(array);
 
    return 0;
}
==3437== Memcheck, a memory error detector
==3437== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3437== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info

3 7
83 86 77 15 93 35 86
92 49 21 62 27 90 59
63 26 40 26 72 36 11

==3437== HEAP SUMMARY:
==3437== in use at exit: 0 bytes in 0 blocks
==3437== total heap usage: 6 allocs, 6 frees, 2,156 bytes allocated
==3437==
==3437== All heap blocks were freed -- no leaks are possible
==3437==
==3437== For lists of detected and suppressed errors, rerun with: -s
==3437== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Добавлено через 11 минут
Если обратить внимание на количество операций alloc в выводе валгринда. можно заметить, что на массив 3х7 понадобилось 4 таких операции. Есть другой способ, более экономичный:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int main (void) {
    srand( (unsigned)time(NULL)/2 );
 
    /* узнаем размеры массива */
    int rows, columns;
    printf(">> ");
    if (scanf("%d%d", &rows, &columns) != 2 || rows < 1 || columns < 1) {
        fprintf(stderr, "Wrong size.\n");
        return 1;
    }
 
    /* запрашиваем память под массив */
    float ** numbers = (float**) malloc(sizeof(float *) * rows);
    // ^^^ сначала создаем массив указателей на строки двумерного массива
    if (numbers == NULL) {  // если память не дали
        fprintf(stderr, "Error allocate memory.\n");    // сообщаем об ошибке
        return 2;           // выходим с кодом ошибки
    }
 
    numbers[0] = (float *) malloc(sizeof(float) * rows*columns);
    // ^^^ затем создаем одномерный массив для хранения данных
    if (numbers[0] == NULL) {
        fprintf(stderr, "Error allocate memory.\n");
        free(numbers);      // освобождаем память, которую уже успели занять
        return 2;
    }
    // и наконец, "пришиваем" соответствующие строки к указателям
    for (size_t i = 1; i < rows; i++)
        numbers[i] = numbers[i-1] + columns;
 
    /* заполняем массив случайными: */
    int i, k;
    for (i = 0; i < rows; i++)
        for (k = 0; k < columns; k++)
            numbers[i][k] = rand() %5 + 1.0 / (1 + rand() %5);
 
    /* выводим элементы массива на экран */
    for (i = 0; i < rows; i++) {
        for (k = 0; k < columns; k++)
            printf("%6.2lf", numbers[i][k]);
        puts("");
    }
 
    /* освобождаем память и выходим */
    free(numbers[0]);
    free(numbers);
    return 0;
}
==3640== Memcheck, a memory error detector
==3640== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3640== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info

>> 3 7
2.50 1.50 1.25 4.20 4.20 4.33 0.50
4.20 1.33 0.50 2.25 5.00 1.25 0.20
3.25 3.50 1.20 4.25 2.25 2.50 4.50

==3640== HEAP SUMMARY:
==3640== in use at exit: 0 bytes in 0 blocks
==3640== total heap usage: 4 allocs, 4 frees, 2,156 bytes allocated
==3640==
==3640== All heap blocks were freed -- no leaks are possible
==3640==
==3640== For lists of detected and suppressed errors, rerun with: -s
==3640== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Как видно, в этом случае требуется всего два обращения к памяти, что в два раза меньше. Самое приятное, что при любом размере массива нам всегда понадобится ровно два вызова malloc для запроса памяти под массив и ровно два free для освобождения этой памяти в конце программы.

На первый взгляд разница незначительная. Но предположим, что у нас есть двумерный массив, который хранит цвет каждого пикселя картинки 1920 х 1080.

Просто на то, чтобы создать такой массив первым способом, понадобится 1081 вызов malloc()
Вторым - по-прежнему всего 2.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2020, 07:44
Помогаю со студенческими работами здесь

Как задать двумерный динамический массив
Задание следующее нужно задать и заполнить двумерный массив размером 2хt. Пользователь вводит произвольное число t, где t - количество...

Как правильно объявить двумерный динамический массив через malloc
Подскажите как правильно объявить двумерный динамический массив через malloc типа инт размером 100х100?

Как правильно выделить память под двумерный динамический массив
подскажите как правильно выделить память под двумерный динамический массив?

Как создать динамический массив
помогите

Как создать динамический массив?
моя программа не присваивает элементам массива нужное значение что здесь неправильно?#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru