Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 11.11.2018
Сообщений: 8

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

18.11.2018, 20:02. Показов 1922. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем привет, и мой, пожалуй, последний вопрос: как правильно объявлять двухмерные динамические массивы? (char**)
Если я пишу
C++
1
char **buffer = new char*;
Во время исполнения программы пишет "Ошибка сегментации"
Чё он там забыл выделить, я не знаю. Помогите пж!
PS:Желательно именно массив СИ, но можно как-то и в векторе(у меня тоже не получалось)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2018, 20:02
Ответы с готовыми решениями:

Как объявлять указатели на двухмерные массивы?
Чет связь больно близкая, по моему указатель когда указываешь на массив, он превращается в массив, только безразмерный. # include...

Как правильно объявлять массивы
У меня вопрос: Я видел объявления массивов, где в скобках писались нолики и еденицы В теме про объявление, заполнение и т. д. никакой...

Как правильно объявлять массивы?
Добрый день, помогите разобраться пожалуйста, объявление массива такого вида на С# private float GeomObject = new float; Пробую...

2
 Аватар для peter_irich
369 / 225 / 53
Регистрация: 18.10.2017
Сообщений: 2,394
18.11.2018, 22:20
Лично я использую в их качестве одномерные, т.е. сам рассчитываю одномерный индекс по двум индексам
а память выделяю вручную, именно в C.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,932
19.11.2018, 11:15
Лучший ответ Сообщение было отмечено Alexanrd как решение

Решение

Цитата Сообщение от Alexanrd Посмотреть сообщение
как правильно объявлять двухмерные динамические массивы?
В С/С++ нет двумерных динамических массивов. Для их ручной реализации можно воспользоваться тремя способами:
1. Массив массивов. Наиболее громоздкий и опасный способ, который тут на форуме, почему-то, часто используется:
C
1
2
3
4
5
6
7
8
9
10
11
char **arr = (char*)malloc(sizeof(char*) * w);
//проверка выделения памяти, которую почему-то никто не делает, хотя должны бы!
for(i=0; i<w; i++){
  arr[i] = (char)malloc(sizeof(char) * h);
  //проверка выделения, которую опять же никто не делает!
}
...
arr[x][y] = z;
...
for(i=0; i<w;i++)free(arr[i]);
free(arr);
2. Отображение на одномерный массив. Гораздо более безопасный и простой способ
C
1
2
3
4
5
6
char *arr = (char*)malloc(sizeof(char) * w * h);
//проверка выделения
...
arr[ x + w*y ] = z; //w - ширина массива, она еще в выделении использовалась
...
free(arr);
3. Гибридный способ. Начало массива интерпретируется как таблица указателей. В отличие от первого варианта, массив остается массивом, в отличие от второго, присутствуют накладные расходы
Подвид 1. Раздельное хранение адресов и данных (вариант тов. stake-k26)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//выделяем память для "а" указателей:
    m = (int **) malloc(a * sizeof(int*)); if (!m) return -1;
    // в первом указателе размещаем память под весь массив:
    m[0] = (int*) malloc(a * b * sizeof(int));
    if (!m[0]) { free(m); return -1; }
    // переписываем адреса необходимых указателей:
    for (size_t x=1; x<a; x++)
        m[x] = m[x-1] + b;
 
    // работаем с элементами массива:
    printf("\n");
    for (i=0; i<a; i++){
        for (j=0; j<b; j++){
            k = i+j;
            m[i][j] = k;
            printf("%2d", m[i][j]);
        }
        printf("\n");
    }
 
    // освобождаем память и выходим
    free(m[0]);
    free(m);
Подвид 2: совмещенное (моя модификация)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(){
  double **arr;
  int M=5, N=3;
  int i, j;
  //инициализация (немного магии с указателями)
  arr = (double**)malloc(sizeof(double)*M*N + sizeof(double*)*M);
  for(i=0; i<M; i++){
    arr[i] = (double*)((char*)arr + sizeof(double*)*M + i*N*sizeof(double));
  }
  //доступ
  for(i=0; i<M; i++)
    for(j=0;j<N;j++)
      arr[i][j]=10*i+j;
  
  for(j=0; j<N; j++){
    for(i=0; i<M; i++)printf("%f\t", arr[i][j]);
    printf("\n");
  }
  //удаление
  free(arr);
}
Наиболее простым и удобным в использовании мне кажется 2-й вариант, отображение на одномерный массив. Элементарно масштабируется до любой размерности, хоть 8-мерный массив делайте, будет не менее эффективно, чем одномерный. Проверка выделения памяти нужна всего в одном месте. Массив представляет собой единое целое, хорошо поддается копированию и заполнению через memcpy, memset и т.п.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2018, 11:15
Помогаю со студенческими работами здесь

Как объявлять и инициализировать динамические структуры?
С помощью операции new нужно создать массив из трёх элементов структуры. Пытался это сделать, но возникают проблемы из присваиванием...

Как правильно объявлять переменные?
Здравствуйте, перед тем как писать что то наподобие &quot;google в помощь&quot; скажу что на разных сайтах написано по разному! Собственно говоря...

Как правильно объявлять классы
Предположим, есть класс .box, который будет использоваться только в div-ах. Как вы его объявите в стилях, как .box или все же как div.box? ...

Как правильно объявлять ArrayList?
Готовлюсь к прохождению собеседования, на хабре где то вычитал, что правильно объявлять так List ggg = new ArrayList(); а не так ...

Указатели. Как правильно объявлять
Я не пойму, почему в указательях звезду ставят то после пробела (пример1), то до (пример2) //пример1 int n = 6; // Объявление...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru