Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
FerrariF70
3 / 2 / 2
Регистрация: 04.02.2017
Сообщений: 177
1

Выделение памяти под двумерный массив

16.03.2018, 23:14. Просмотров 364. Ответов 9
Метки нет (Все метки)

Здравствуйте!
скажите пожалуйста почему нельзя выделить под двумерный массив память через функцию. т.е возможно выделить но только под строки? но не как не под длину строки. Т.е если я хочу выделить память для длины строк то я должен это сделать через другую функцию.
Спасибо!

пример:

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
main()
{
    int **array=NULL;
    malloc_arr(&array,3);
    createColumn(array,3);
}
void malloc_arr(int **array,int size)
{
    if (!(*array = (int**)malloc(sizeof(int*) * size))) {
        exit(1);
    }
 
       for (i = 0;i < size;i++) { //при присвоении значений в другой функции будет ругаться
        if (!(*(array+ i) = (int*)malloc(sizeof(int)*size)))
            exit(1);
    }
}
void createColumn(int **array,int size)
{
    int i=0;
    for (i = 0;i < size;i++) {
        if (!(*(array + i) = (int*)malloc(sizeof(int)*size)))
            exit(1);
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2018, 23:14
Ответы с готовыми решениями:

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

Неправильное выделение памяти под двумерный массив
Добрый вечер. Пишу код, по численным методам. Алгоритм разобрал, но мучаюсь с выделением памяти под...

Выделение памяти под двумерный массив через функцию
Вообщем пытался найти на форуме, но почему то так и не получилось (видимо плохл искал :)). Как...

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

Выделение памяти под трехмерный массив
Здравствуйте. Выделяю память под трехмерный массив, но не получается обратиться к элементу...

9
palva
3213 / 2316 / 479
Регистрация: 08.06.2007
Сообщений: 8,365
Записей в блоге: 4
17.03.2018, 09:43 2
C
1
2
3
4
5
6
7
8
9
10
11
12
void malloc_arr(int ***array,int size)
{
    int i;
    if (!(*array = (int**)malloc(sizeof(int*) * size))) {
        exit(1);
    }
 
       for (i = 0;i < size;i++) { //при присвоении значений в другой функции будет ругаться
        if (!(*(*array+ i) = (int*)malloc(sizeof(int)*size)))
            exit(1);
    }
}
Только в функции createColumn вы выделяете память повторно. Вы уже выделили ее в функции malloc_arr под размер 3. Так что у вас произойдет утечка памяти.
0
COKPOWEHEU
1341 / 971 / 222
Регистрация: 09.09.2017
Сообщений: 4,041
17.03.2018, 09:56 3
Цитата Сообщение от FerrariF70 Посмотреть сообщение
скажите пожалуйста почему нельзя выделить под двумерный массив память через функцию
Потому что в Си нет динамических двумерных массивов. То что вы делаете - массив массивов. Наиболее близкое к статическим двумерным массивам делается так
C
1
2
3
4
5
6
int *_arr = (int*)malloc(M*N*sizeof(int));
#define arr(i, j) _arr[i+j*M]
_arr[1+M*2]=3;
arr(1,2)=3; //то же самое что предыдущая строка
...
free(_arr);
В отличие от вашего варианта это именно единый массив, который можно, например, копировать memcpy. Ну и накладных расходов по памяти меньше. По скорости зависит от реализации, где-то хуже, где-то лучше.
0
palva
3213 / 2316 / 479
Регистрация: 08.06.2007
Сообщений: 8,365
Записей в блоге: 4
17.03.2018, 10:08 4
Тут непонятно для каких целей. Бывает, что такой способ хранения оправдан. Например, он предполагает строки разной длины. Например, первый индекс -- номер вершины в графе, а второй индекс для перечисления тех вершин, с которыми связана данная вершина. Массив строк при передаче в программу параметров запуска хранится именно таким образом.
0
17.03.2018, 10:08
FerrariF70
3 / 2 / 2
Регистрация: 04.02.2017
Сообщений: 177
17.03.2018, 10:47  [ТС] 5
вот написал вам более подробнее и оно не работает когда мы выделяем в функции память под строки и под длину строк в одной функции.

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
#include<stdio.h>
#include<stdlib.h>
 
void malloc_arr(int **, int);
void insertToArray(int **);
void printArray(int **);
void delete(int **);
main()
{
    int **array = NULL;
    int i = 0;
    malloc_arr(&array, 3);
    
    createColumn(array, 3);
    insertToArray(array);
    printArray(array);
 
    while (i<3)
        free(*(array + i++));
    free(array);
 
    return 0;
 
}
void printArray(int **array)
{
    int i, j;
    for (i = 0;i < 3;i++)
        for (j = 0;j < 3;j++)
            printf("%d ", *(*(array + i) + j));
}
void insertToArray(int **array)
{
    int i, j;
    for (i = 0;i < 3;i++)
        for (j = 0;j < 3;j++)
            *(*(array + i) + j) = 2 * j; //Ругается
 
}
void malloc_arr(int **array, int size)
{
    int i;
    if (!(*array = (int**)malloc(sizeof(int*) * size))) {
        exit(1);
    }
 
    for (i = 0;i < size;i++) { 
        if (!(*(array + i) = (int*)malloc(sizeof(int)*size)))
            exit(1);
    }
}
0
palva
3213 / 2316 / 479
Регистрация: 08.06.2007
Сообщений: 8,365
Записей в блоге: 4
17.03.2018, 10:59 6
Я разобрал вашу первую программу исправил ошибки и написал код, который должен работать. Вы посмотрели?
Или вам надо словами объяснять какие ошибки вы делаете?
Разве компилятор не говорит вам эти слова?
Теперь вы предлагаете мне разбирать второй вариант с теми же ошибками.

И потом, что значит не работает? У меня такое даже не компилируется (я о первом варианте). Работать даже не начинает.
0
FerrariF70
3 / 2 / 2
Регистрация: 04.02.2017
Сообщений: 177
17.03.2018, 15:48  [ТС] 7
Цитата Сообщение от palva Посмотреть сообщение
Я разобрал вашу первую программу исправил ошибки и написал код, который должен работать. Вы посмотрели?
Или вам надо словами объяснять какие ошибки вы делаете?
Разве компилятор не говорит вам эти слова?
Теперь вы предлагаете мне разбирать второй вариант с теми же ошибками.
Не увидел три звёздочки спасибо

Добавлено через 4 часа 42 минуты
Цитата Сообщение от FerrariF70 Посмотреть сообщение
palva
а как сделать realloc двумерному массиву?

C
1
2
3
4
5
6
if (!(*array = (int *)realloc(array, sizeof(int)*size)))
        exit(1);
    
    while (i++ < size)
        if (!(*(*array + i) = (int *)realloc(array,sizeof(int)*size)))
            exit(1);
так правильно?
0
palva
3213 / 2316 / 479
Регистрация: 08.06.2007
Сообщений: 8,365
Записей в блоге: 4
17.03.2018, 16:33 8
Может рухнуть. Скажем, у вас увеличился size. Первый realoc у вас пройдет, а в цикле вы выйдете на неразмещенные одномерные массивы, в качестве адресов которых у вас будет мусор. На них надо делать malloc, а не realloc.
0
COKPOWEHEU
1341 / 971 / 222
Регистрация: 09.09.2017
Сообщений: 4,041
17.03.2018, 17:18 9
Цитата Сообщение от palva Посмотреть сообщение
Бывает, что такой способ хранения оправдан. Например, он предполагает строки разной длины.
Несомненно. Вот только это уже совсем не двумерный массив, а именно массив строк.
Цитата Сообщение от palva Посмотреть сообщение
Массив строк при передаче в программу параметров запуска хранится именно таким образом.
Вот не уверен, там может быть единый массив на всю командную строку, плюс отдельные указатели на начало каждой подстроки. Впрочем, полагаться на это нельзя, так что в общем случае вы правы. И как и в прошлом случае никто не трактует это как двумерный массив.
0
FerrariF70
3 / 2 / 2
Регистрация: 04.02.2017
Сообщений: 177
17.03.2018, 17:36  [ТС] 10
Цитата Сообщение от palva Посмотреть сообщение
Может рухнуть. Скажем, у вас увеличился size. Первый realoc у вас пройдет, а в цикле вы выйдете на неразмещенные одномерные массивы, в качестве адресов которых у вас будет мусор. На них надо делать malloc, а не realloc.
в первом realloc индекс не надо указывать?
потому что делал уже по разному. Ругается когда присваиваю значение.
0
17.03.2018, 17:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2018, 17:36

Выделение памяти под динамический массив
Нужна помощь, кому не трудно откликнитесь. Нубас вообще в указателях и выделении памяти. ...

Динамическое выделение памяти под массив
Здравствуйте, помогите пожалуйста сделать в процедуре input динамическое выделение памяти под...

Выделение памяти динамически под массив
Есть программа, нужно выделить динамически память под массив, все попытки сделать это...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru