Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
BuBlicK.SQP
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 21
1

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

01.03.2013, 00:07. Просмотров 863. Ответов 3
Метки нет (Все метки)

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

Алгоритм и работа правильная. Проблема только в выделении памяти и передачи переменных функциям, из-за пробела в указателях.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h> //scanf, printf
#include <conio.h> //getch
 
void matrix_assign (int n, int ***matrix);
void matrix_diplay (int n, int **matrix);
 
void main (){
    int n, i, j, max, **matrix;
//n-размерность, i и j для счётчиков, max для хранения макс. элемента
    n=EnterN();
    matrix=(int *)malloc(n*sizeof(int));
    matrix_assign(n, **matrix);
    matrix_diplay(n, matrix);
    max=matrix_check(n, matrix);
    //Вывод максимального элемента.                 
    printf("\nMAX element of this matrix is %d",max);               
    getch();
}
 
//Ввод N для определения размерности матрицы
int EnterN(){
int n;
    do
    {
    printf("BBEDUTE N\n N=");
    scanf("%d",&n);         
    } while (n>=12);
    return (n); 
}
 
//ввод элементов матрицы
void matrix_assign(int n, int ***matrix){
    int i, j;
    for (i=0; i<n; i++)
        for (j=0;j<n;j++)
        {
            printf ("BBEDUTE matrix[%d][%d]\n",i, j);
            scanf("%d",&matrix[i][j]);
        }
    
}
 
//Вывод матрицы на экран.
void matrix_diplay(int n, int **matrix){
    int i, j;
        for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)printf("[%2.1i] ",matrix[i][j]);
        printf("\n");
    }
    getch();    
}
 
//Проверка первой половины матрицы. Сверху вниз.
int matrix_check(int n, int **matrix){
    int max, i, j;
        for(i=0;i<(int)(n/2);i++)
        for (j=i;j<n-i;j++)
//Сравнение текущего [i][j] элемента с максимальным
            if (matrix[i][j]>max)max=matrix[i][j];
//Проверка оставшейся части матрицы.    
    for(;i<n;i++)
        for (j=n-i-1;j<=i;j++)
            if (matrix[i][j]>max) max=matrix[i][j]; 
    return (max);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 00:07
Ответы с готовыми решениями:

Выделение памяти под динамический массив строк
Суть программы такова: при вызове функции количество структур увеличивается на одну, выделяется под...

Выделение памяти под динамический массив выдает ошибку
В общем проблема такова, при компиляции вылазит ошибка: 27 C:\Users\USER\Desktop\projects\main.c...

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

Выделение памяти под двумерный массив
Здравствуйте! скажите пожалуйста почему нельзя выделить под двумерный массив память через функцию....

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

3
anmartex
...
1733 / 1217 / 917
Регистрация: 12.02.2013
Сообщений: 1,994
01.03.2013, 06:46 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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h> //scanf, printf
#include <stdlib.h>
#include <conio.h> //getch
 
int EnterN();
void matrix_assign(int, int**);
void matrix_diplay(int, int**);
int matrix_check(int, int**);
 
int main()
{
   int n, i, max, **matrix;
   //n-размерность, i и j для счётчиков, max для хранения макс. элемента
   n = EnterN();
   matrix = (int**) malloc(n * sizeof(int*));
   for (i = 0; i < n; ++i)
   {
      matrix[i] = (int*) malloc(n * sizeof(int));
   }
 
   matrix_assign(n, matrix);
   matrix_diplay(n, matrix);
   max = matrix_check(n, matrix);
   //Вывод максимального элемента.
   printf("\nMAX element of this matrix is %d", max);
   getch();
 
   return 0;
}
 
//Ввод N для определения размерности матрицы
int EnterN()
{
   int n;
   do
   {
      printf("BBEDUTE N\n N=");
      scanf("%d", &n);
   }
   while (n >= 12);
   return (n);
}
 
//ввод элементов матрицы
void matrix_assign(int n, int** matrix)
{
   int i, j;
   for (i = 0; i < n; i++)
      for (j = 0; j < n; j++)
      {
         printf("BBEDUTE matrix[%d][%d]\n", i, j);
         scanf("%d", &matrix[i][j]);
      }
 
}
 
//Вывод матрицы на экран.
void matrix_diplay(int n, int** matrix)
{
   int i, j;
   for (i = 0; i < n; i++)
   {
      for (j = 0; j < n; j++)
      {
         printf("[%2.1i] ", matrix[i][j]);
      }
      printf("\n");
   }
   getch();
}
 
//Проверка первой половины матрицы. Сверху вниз.
int matrix_check(int n, int** matrix)
{
   int max = 0, i, j;
   for (i = 0; i < (int)(n / 2); i++)
      for (j = i; j < n - i; j++)
         //Сравнение текущего [i][j] элемента с максимальным
         if (matrix[i][j] > max)
         {
            max = matrix[i][j];
         }
   //Проверка оставшейся части матрицы.
   for (; i < n; i++)
      for (j = n - i - 1; j <= i; j++)
         if (matrix[i][j] > max)
         {
            max = matrix[i][j];
         }
   return (max);
}
Выделение памяти под динамический массив


Исходник + бинарник: program.7z
1
BuBlicK.SQP
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 21
01.03.2013, 20:40  [ТС] 3
anmartex,

спасибо большое. Я исправил сам и работает. Если можно, то у меня есть вопросы.
1. Зачем использовать двойной указатель? Я всюду использовал один указатель и только на матрицу.
2. Как работают (int**), (int*) и (int)? В чем разница?
3. Как правильно определить нужный объем памяти? Я, например выделил (n*n+1)

Спасибо.
0
anmartex
...
1733 / 1217 / 917
Регистрация: 12.02.2013
Сообщений: 1,994
04.03.2013, 07:50 4
Извините за столь долгое молчание, дела.

Цитата Сообщение от BuBlicK.SQP Посмотреть сообщение
1. Зачем использовать двойной указатель? Я всюду использовал один указатель и только на матрицу.
2. Как работают (int**), (int*) и (int)? В чем разница?
3. Как правильно определить нужный объем памяти? Я, например выделил (n*n+1)
Начнём пожалуй вообще с понятия указатель. Вы, я полагаю, уже поняли, что это такая же переменная, только в себе хранит адрес участка памяти. Т.е. выглядит это примерно так:
Название: pointer01.png
Просмотров: 172

Размер: 15.5 Кб
Основной особенность такой переменной является применение к ней разадресации, т.е. когда вы пишите *b, происходит переход по адресу хранимого в переменной b. Для простых переменных разадресация не применима. И т.к. указатель хранит всего-лишь адрес, то он применим как к конкретной переменной, так и к вектору (массиву) значений. Т.е. вы можете получить значение так *b, и так b[0] (по сути компилятор преобразует эту запись в *(b+0)). Соответственно ваш массив представляется следующим образом:
Выделение памяти под динамический массив

Как видите, такой массив - это указатель на список указателей векторов. Поэтому и выделение памяти было хитрым:
  1. Выделяем память под массив указателей matrix = (int**) malloc(n * sizeof(int*));
  2. А теперь выделяем память под каждый вектор в цикле matrix[i] = (int*) malloc(n * sizeof(int));.
Я думаю все что изложено выше вам даст ответы на ваши вопросы.

P.S.: вообще-то это всё рассматривается практически в любой книге по C/C++.
0
04.03.2013, 07:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2013, 07:50

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

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

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


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

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

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