Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 22:44     Выделить память под двумерный массив за один вызов функции malloc #1

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

Если можно - с комментариями
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 22:44     Выделить память под двумерный массив за один вызов функции malloc
Посмотрите здесь:

Выделить память под массив в 100500 индексе. Возможно ли? C++
C++ Динамически выделить память под массив
C++ Как создать динамический двумерный массив с использованием функции malloc?
C++ Выделить память под динамический массив указателей
Выделить и удалить память под 4 мерный массив C++
Нужно ли под массив выделять память функциями malloc или new? C++
Как выделить память под динамический двумерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 22:52     Выделить память под двумерный массив за один вызов функции malloc #2
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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int (*a)[4];
    int i, j;
 
    a = (int (*)[4])malloc( 4 * 4 * sizeof( int ) );
 
    for ( i = 0; i < 4; i++ ) {
        for ( j = 0; j < 4; j++ ) {
            a[i][j] = i + j;
        }
    }
 
    for ( i = 0; i < 4; i++ ) {
        for ( j = 0; j < 4; j++ ) {
            printf( " %2d", a[i][j] );
        }
        printf( "\n" );
    }
 
    return 0;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 22:58     Выделить память под двумерный массив за один вызов функции malloc #3
C
1
2
3
4
5
6
7
8
9
10
11
int **arr = malloc(n * sizeof(*arr));
arr[0] = malloc(n * m * sizeof(**arr));
 
for (int i = 0; i < n; i++) {
    arr[i] = arr[0] + m * i;
}
 
// ...
 
free(arr[0]);
free(arr);
Более универсальный вариант. (Принцип, как сделать из этого действительно один вызов, должен быть понятен.)
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:02     Выделить память под двумерный массив за один вызов функции malloc #4
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Более универсальный вариант.
? o_O
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 23:04     Выделить память под двумерный массив за один вызов функции malloc #5
Цитата Сообщение от lazybiz Посмотреть сообщение
? o_O
C
1
int (*a)[4];
Внимание на четвёрку, которая фиксирована и должна быть известна при компиляции.
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:05     Выделить память под двумерный массив за один вызов функции malloc #6
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Внимание на четвёрку, которая фиксирована и должна быть известна при компиляции.
Внимание на задание.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 23:08     Выделить память под двумерный массив за один вызов функции malloc #7
Цитата Сообщение от lazybiz Посмотреть сообщение
Внимание на задание.
И что я должен там увидеть?
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:11     Выделить память под двумерный массив за один вызов функции malloc #8
Ну давай объясню если ты сам этого не можешь понять..
1. "за один вызов функции malloc"
2. ТС не говорил что ему нужен динамический массив, поэтому упреки в сторону 4-ки беспричинны.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 23:16     Выделить память под двумерный массив за один вызов функции malloc #9
Ну вот вам за один вызов, боже мой:
C
1
2
3
4
5
6
7
8
9
10
11
12
int** alloc(size_t n, size_t m)
{
    void *data = malloc(n * m * sizeof(int) + n * sizeof(int*));
    
    int **result = data;
    result[0] = ((int *) data) + n;
    for (size_t i = 0; i < n; i++) {
        result[i] = result[0] + n * i;
    }
 
    return result;
}
И я не упрекаю в фиксированности. Просто говорю, что это не совсем гибкий подход.
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 23:20  [ТС]     Выделить память под двумерный массив за один вызов функции malloc #10
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ну вот вам за один вызов, боже мой:
C
1
2
3
4
5
6
7
8
9
10
11
12
int** alloc(size_t n, size_t m)
{
    void *data = malloc(n * m * sizeof(int) + n * sizeof(int*));
    
    int **result = data;
    result[0] = ((int *) data) + n;
    for (size_t i = 0; i < n; i++) {
        result[i] = result[0] + n * i;
    }
 
    return result;
}
И я не упрекаю в фиксированности. Просто говорю, что это не совсем гибкий подход.
а можно с комментариями поподробней ?) хочу разобраться в этом...
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:22     Выделить память под двумерный массив за один вызов функции malloc #11
Увы, но тут двумерными массивами даже и не пахнет.
На этапе компиляции неизвестен размер строки.
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 23:24  [ТС]     Выделить память под двумерный массив за один вызов функции malloc #12
Цитата Сообщение от lazybiz Посмотреть сообщение
Увы, но тут двумерными массивами даже и не пахнет.
На этапе компиляции неизвестен размер строки.
а как сделать для динамического массива не известной длины который мы будем брать из файла? можно просто функцию...
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:24     Выделить память под двумерный массив за один вызов функции malloc #13
Как ты им будешь пользоваться? a[i * m + j] ?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.05.2013, 23:31     Выделить память под двумерный массив за один вызов функции malloc #14
Как делают обычно, чтобы получить массив размера n на m:
C
1
2
3
4
5
6
7
8
9
10
11
12
int** alloc(size_t n, size_t m)
{
    // выделяем место под n указателей на одномерные массивы
    int **result = malloc(n * sizeof(*result));
 
    // каждому из них создаём по персональному массиву
    for (size_t i = 0; i < n; i++) {
        result[i] = malloc(m * sizeof(**result));
    }
 
    return result;
}
Вся фишка ведь в том, что если int **arr = alloc(n, m); то потом arr[i][j] читается как (arr[i])[j] — вытягивается указатель на нужный одномерный массив, а потом в этом массиве вытягивается нужный элемент двумерного массива.

В том варианте память под оба массива выделяется за один раз. Указателям без разницы, сколько там раз была вызвана malloc().
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}
Статические двумерные массивы сделаны примерно так же, только с той поправкой, что количество элементов в строке фиксировано, так что можно не хранить эти лишние указатели в начале, а сразу адресовать нужный элемент подобно тому, как в посте над этим. В принципе, и в динамическом случае так можно делать, но тогда не будет сахарка arr[i][j].
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:32     Выделить память под двумерный массив за один вызов функции malloc #15
Многомерный динамический массив выделить нельзя, только псевдо-многомерный, как показал OhMyGodSoLong
Обращаться к нему таким образом: array[i][j] - не получится.
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 23:33  [ТС]     Выделить память под двумерный массив за один вызов функции malloc #16
Цитата Сообщение от lazybiz Посмотреть сообщение
Как ты им будешь пользоваться? a[i * m + j] ?
это одна из лаб в универе, все что указано в задании - в начале топика, мне просто необходимо понять как за один проход цикла реализовать через эту функцию выделение памяти
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:35     Выделить память под двумерный массив за один вызов функции malloc #17
Цитата Сообщение от Isantel Посмотреть сообщение
мне просто необходимо понять как за один проход цикла реализовать через эту функцию выделение памяти
А сначала ты говорил "за один вызов".. Как это понимать?
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 23:38  [ТС]     Выделить память под двумерный массив за один вызов функции malloc #18
Цитата Сообщение от lazybiz Посмотреть сообщение
А сначала ты говорил "за один вызов".. Как это понимать?
все правильно, за один вызов, это я сейчас ошибся
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
14.05.2013, 23:39     Выделить память под двумерный массив за один вызов функции malloc #19
Я был не прав, можно создать и динамический за один вызов malloc. Смотри последний пост OhMyGodSoLong
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 23:54     Выделить память под двумерный массив за один вызов функции malloc
Еще ссылки по теме:

C++ Выделить память под массив размера 2^64 байтов
Как правильно выделить память под двумерный массив в шаблоне? C++
C++ Выделить память под массив неизвестной длины
C++ Выделить память под массив 1000х1000 элементов типа double
Динамически выделить память под массив функций C++

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

Или воспользуйтесь поиском по форуму:
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
14.05.2013, 23:54  [ТС]     Выделить память под двумерный массив за один вызов функции malloc #20
OhMyGodSoLong,
C++
1
 int** alloc(size_t n, size_t m)
,
ранее не встречал int** - что он означает?? и что это за тип такой "size_t", что мы получаем на вход?
Yandex
Объявления
14.05.2013, 23:54     Выделить память под двумерный массив за один вызов функции malloc
Ответ Создать тему
Опции темы

Текущее время: 23:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru