Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254

Выделить память под двумерный массив за один вызов функции malloc

14.05.2013, 22:44. Показов 6122. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам

Выделить память под двумерный массив
за один вызов функции malloc

Если можно - с комментариями
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2013, 22:44
Ответы с готовыми решениями:

Массив: Нужно выделить память под 2-мерную матрицу, используя malloc...
Здравствуйте!Мне нужно выделить память под 2мерную матрицу в C стиле используя malloc.Я смотрел код одного программиста и он делал как в...

Выделить память под двумерный массив
Есть програмка, нужно сделать что-бы массив mass был двумерный размером 7х4. Malloc должен работать. #include <stdio.h> /*malloc*/ ...

Как выделить память под двумерный массив
b=(int **) calloc (n, sizeof(int *)); for (i=0; i<n; i++) b=(int *) calloc (m, sizeof(int)); Выделяю память под двумерный...

26
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 00:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Isantel Посмотреть сообщение
ранее не встречал int** - что он означает??
Указатель на указатель на int.
Цитата Сообщение от Isantel Посмотреть сообщение
и что это за тип такой "size_t", что мы получаем на вход?
Чаще всего это то же, что и unsigned int. Беззнаковый тип, в который гарантированно влезет размер чего угодно в байтах.

Но только это, учтите: вон тот подход чисто сишный. Для Си++ там надо свои танцы с бубном делать, чтобы оно работало и для объектов. Да и в Си тоже своих танцев хватит (попробуйте таким же образом сделать массив из double).
1
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
15.05.2013, 00:30  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Чаще всего это то же, что и unsigned int. Беззнаковый тип, в который гарантированно влезет размер чего угодно в байтах.
то есть я могу просто передать двумерной массив в эту функцию?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 00:32
Всмысле?
1
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
15.05.2013, 00:59  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Всмысле?
если не трудно можете пример полного кода сделать с вашей функций ??
не совсем понял как вызывать и при компиляции ошибки выдает
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
15.05.2013, 01:05
Ну, как...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int n, m;
// ...
int **array = allocate(n, m);
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        array[i][j] = (i + j) % 3 + j;
    } 
}
// ...
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        printf("%d ", array[i][j]);
    }
    printf("\n");
}
// ...
deallocate(array); // вызывает free(array);
1
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
15.05.2013, 02:03  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ну, как...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int n, m;
// ...
int **array = allocate(n, m);
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        array[i][j] = (i + j) % 3 + j;
    } 
}
// ...
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        printf("%d ", array[i][j]);
    }
    printf("\n");
}
// ...
deallocate(array); // вызывает free(array);
C++
1
    int **result = data;
ошибка - Ошибка error C2440: инициализация: невозможно преобразовать "void *" в "int **"

вообщем получилась такая программа

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
#include "stdafx.h"
#include <stdlib.h> 
 
int** alloc(size_t n, size_t m)
{
    // Массив из n * m интов + память на n указателей.
    void *data = malloc(n * m * sizeof(int) + n * sizeof(int*));
    
    // Первые n * sizeof(int*) байт заняты массивом указателей.
    // Остальной кусок - это двумерный массив.
    int **result = data;
    result[0] = ((int *) data) + n; // = data + n * sizeof(int*)
 
    // Этот массив не только должен существовать, но и указатели
    // в нём должны указывать куда следует. Двумерный массив n * m
    // состоит из n строк по m элементов. Если строки идут подряд, то
    // очевидно, что между i-й и 0-й находится i * sizeof(int) байт.
    for (size_t i = 0; i < n; i++) {
        result[i] = result[0] + m * i;
    }
 
    return result;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int n, m;
// ...
int **array = alloc(n, m);
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        array[i][j] = (i + j) % 3 + j;
    } 
}
// ...
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        printf("%d ", array[i][j]);
    }
    printf("\n");
}
// ...
deallocate(array); // вызывает free(array);
 
    return 0;
}
и что писать в функции
C++
1
 deallocate(array);
я дуб дубом в этом)) может быть поможете полным кодом?)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
15.05.2013, 02:19
Цитата Сообщение от Isantel Посмотреть сообщение
ошибка - Ошибка error C2440: инициализация: невозможно преобразовать "void *" в "int **"
C++
1
int **result = reinterpret_cast<int **>(data);
Добавлено через 12 минут
Так видимо:
C++
1
2
3
void deallocate(int ** array) {
   std::free(reinterpret_cast<void *>(array));
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2013, 02:19
Помогаю со студенческими работами здесь

Выделить память под двумерный массив динамически
Маюсь уже неделю, не могу выделить динамическую память под двумерный массив(чистый Си), чтобы на вход подавать файлы любого размера....

Как выделить память под динамический двумерный массив
Добрый день, достаточно простой вопрос, но почему-то он возник, и нагуглить ответ я не смог. Обычно выделял память под двумерный массив...

Как правильно выделить память под двумерный массив в шаблоне?
template &lt;class T&gt; T* array &lt;T&gt;::f (unsigned size) { //...... T* templateBuf = new T ; for (unsigned index = 0;...

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

Объявить двумерный динамический массив, а после выделить память под него
Подскажите, как объявить двумерный динамический массив, а после выделить память под него. Пытался сделать так:usingAlphabet:array of array...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru