Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/68: Рейтинг темы: голосов - 68, средняя оценка - 4.87
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
1

Динамическое выделение памяти для двумерного массива

16.07.2009, 09:31. Просмотров 14244. Ответов 12
Метки нет (Все метки)

Здравствуйте!

В следующей программе я пытаюсь выделить динамически память для двумерного массива. Размерности массива задаются в качестве аргументов командной строки.

В процессе выполнения программы вылетает исключение. Не подскажите, где моя ошибка?

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
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
    register int i,j;
    int r1, r2;
    
    int **p;
    
    if (argc != 3) exit(1);
    
    r1 = atoi(argv[1]);
    r2 = atoi(argv[2]);
    
    p = malloc(r1*r2*4);
    
    if (!p) {exit(1);}
    
    printf("%d %d\n", r1, r2);
    
    for (i=0;i<r1;i++) {
        for (j=0;j<r2;j++) {
            p[i][j] = rand();
            printf("%d\t", p[i][j]);
        }
        printf("\n");
    }
    
    free(p);
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2009, 09:31
Ответы с готовыми решениями:

Динамическое выделение памяти для массива
Допустим следующее: Имеется массив типа структуры struct stct buf1 Далее массив по ходу...

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

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

Динамическое выделение памяти под массива стуктур
Есть структура struct DATA { char number; char name; char team; int point1; int point2;...

12
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
16.07.2009, 09:38 2
Ну попробуй 16 строку сделать так:
C++
1
p = (int**)malloc(r1*r2*4);
0
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
16.07.2009, 10:12  [ТС] 3
Не помогло. Странно, если задать размер массива 2x2 - исключение не вылетает. А если 5x5, то выводится только 2 строки и вылетает исключение...
0
2806 / 1395 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 10:54 4
PMike, ничего странного... создание двумерного массива осуществляется так:

C++
1
2
3
int **p = (int**) malloc(m*sizeof(int*));
for (int i=0; i<m; i++) 
    p[i] = (int*)malloc(n*sizeof(int*));
m - число строк
n - число столбцов
2
Супер-модератор
8720 / 2376 / 138
Регистрация: 07.03.2007
Сообщений: 11,343
Завершенные тесты: 1
16.07.2009, 11:01 5
можно аналогично методу Monte-Cristo использовать еще функцию calloc, тогда сразу же 0-ми инициализируешь свой массив...
1
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
16.07.2009, 12:55  [ТС] 6
Спасибо, теперь все вроде работает.

Только я не понял, почему

C
1
p[i] = (int*)malloc(n*sizeof(int*));
а не

C
1
p[i] = (int*)malloc(n*sizeof(int));
0
paladin
285 / 185 / 7
Регистрация: 25.02.2009
Сообщений: 590
16.07.2009, 13:17 7
Очепятка, видимо.
0
1 / 1 / 0
Регистрация: 15.05.2009
Сообщений: 8
16.07.2009, 13:33 8
Я немного не понял как ты выделяешь память...

У тебя есть поинтер **р
Я всегда выделяю так:

C++
1
2
3
4
5
6
7
8
// создаем масив из поинтеров размера r1
p = new(nothrow) int*[r1];
 
// помним, что каждаю клетка p[i] , это поинтер, поэтому создаем из него масив размера r2
for(int i=0; i < r2; i++)
{
    p[i] = new(nothrow) int[r2];
}
0
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
16.07.2009, 13:40  [ТС] 9
Теперь понял.

Я так понимаю, что выделить память для двумерного массива одним вызовом функции malloc() нельзя?
0
paladin
285 / 185 / 7
Регистрация: 25.02.2009
Сообщений: 590
16.07.2009, 13:44 10
Цитата Сообщение от PMike Посмотреть сообщение
Я так понимаю, что выделить память для двумерного массива одним вызовом функции malloc() нельзя?
можно выделить память для одномерного, но работать с ним как с двумерным:
C
1
2
a = (int*)malloc(m*n*sizeof(int));
a[i*n + j];
1
2806 / 1395 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 14:33 11
PMike, если ты работаешь в C++, то для выделения лучше использую связку new-delete.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Одномерный массив размера n */
// создание
int *p = new int[n]; 
// удаление
delete[] p;
 
/* двумерный массив m на n */
// создание
int **p = new int*[m]; // создается массив указателей
for (int i=0; i<m; i++)
    p[i] = new int[n];
 
// удаление
for (int i=0; i<m; i++)
    delete[] p[i];
delete[] p;
1
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
16.07.2009, 15:40  [ТС] 12
Ясно, спасибо. А чем операторы new-delete лучше функций malloc-free ?
0
2806 / 1395 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 15:57 13
во-первых, new-delete считается хорошим тоном программирования ( если вы программируете на C++, а не на C )
во-вторых, new активирует конструктор в классе ( на сколько мне известно, malloc вроде бы не активирует)
new-delete может быть перегружен для класса...

а вообще почитайте на форуме или поищите. в инете полно информации на этот счет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2009, 15:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Динамическое выделение памяти для матрицы
Программа выглядит так. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; typedef int *pInt; int main() { ...

Как задать размеры массива пользователем, не используя динамическое выделение памяти
хм...интересный &quot;финт ушами&quot;: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int n,...

Динамическое выделение памяти
int *a = (int*)malloc(n * sizeof(int)); int *a // это тип указателя (int* ) // зачем вот это...

Динамическое выделение памяти
Необходимо выделить память с помощью функции melloc под 5 символов char. При вводе пользователем...


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

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

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