Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384

Организация динамического двухмерного массива. Порядок распределения памяти

20.10.2016, 10:59. Показов 751. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, софорумцы, здравствуйте.
Как всегда, преподавателя ещё нет, а я не знаю прав я или нет.
Задача.
Требуется организовать двухмерный массив.
Мой порядок действий.
1. Вначале объявляется указатель на указатель
2. После мы резервируем память на указатель, в нашем случае массив указателей. В зависимости от количество выделенной памяти.
3. Каждым указателем массива указываем на необходимое кол-во памяти для столбцов массива
4. Заполняем массив.
Фрагмент кода:
C
1
2
3
4
5
6
7
8
9
10
11
12
int **array;// указатель на указатели
   int i, j, n;
   printf("Введите кол-во строк квадратной целочисленной матрицы A:");
   scanf("%d",&n);// кол-во элементов указателей в массиве
   array=(int**)malloc(n*sizeof(int));//выделяем место для массива указателей
   for(i=0;i<n;i++)
    {
    array[i]=(int*)malloc(n*sizeof(int));// выделяем место для столбцов при каждой итерации
    for(j=0;j<n;j++){
        printf("[%d][%d]=",i,j);
        scanf( "%d", &array[i][j]);
     }}
Ещё один вопрос. Я как-то решил наглядно проверить распределение динамической памяти.
Решил указать на место меньшего размера, чем требуется.
Фрагмент кода:
C
1
2
3
4
5
6
7
int *array;
    int i,n=9,k=1;
    array=(int*)malloc(k*sizeof(int));
    for(i=0;i<n;i++)
        {
    printf("[%d]=",i);
        scanf("%d",array+i);
В данном случае ошибка памяти вылетает только на 9-ом элемента. На 8 всё норм, хотя наглядно видно, что я выделяю всего 2 байта.
Такой вывод. Система резервирует сама какую-то часть памяти без ведома программиста?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2016, 10:59
Ответы с готовыми решениями:

Моделирование динамического распределения памяти в операционной системе
Написать программу, моделирующую динамическое распределение памяти в операционной системе. В качестве модели оперативной памяти программа...

Разработать собственные функции динамического распределения памяти
Разработать собственные функции динамического распределения памяти, используя в качестве “кучи” динамический массив, создаваемый обычной...

заполнение двухмерного динамического массива
заполняю массив так arr:array of array of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender:...

7
 Аватар для Le0nX
1 / 1 / 1
Регистрация: 07.07.2016
Сообщений: 11
20.10.2016, 12:22
хотя наглядно видно, что я выделяю всего 2 байта.
А почему 2 байта, если sizeof(int) = 4 ?
0
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384
20.10.2016, 12:22  [ТС]
Точнее, 4 байта
0
 Аватар для Le0nX
1 / 1 / 1
Регистрация: 07.07.2016
Сообщений: 11
20.10.2016, 12:29
Насколько я знаю, то malloc() выделяет память из кучи и возвращает указатель на начало этого участка. Но она не проверяет выходза его пределы. Под свою программу Вы выделили именно 4 байта, остальное это не размеченная область памяти, в ней хранится мусор и Вы можете её использовать, но не факт, что все будет гладко, можно набрести на область памяти другого процесса или типа того.
0
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384
20.10.2016, 12:34  [ТС]
Le0nX, короче, понял. Таким образом, вначале, пока есть место в выделенной памяти, мы записываем туда значения, а когда она заканчивается, память рандомно выделяется, притом неизвестно откуда?
0
 Аватар для Le0nX
1 / 1 / 1
Регистрация: 07.07.2016
Сообщений: 11
20.10.2016, 12:48
Думаю, что при выходе за выделенный блок, мы начинаем линейно занимать память.(поправьте, если не прав)
Проблема в том, что выделенный блок становится недоступным для остальных и мы не сможем его затереть, если будем делать все правильно, а вот, значения, которые хранятся вне выделенного блока не защищены и ,возможно, при следующих вызовах malloc() могут стать частью совсем других блоков памяти и будут затерты.

Добавлено через 3 минуты
Вы можете проверить выделение памяти, если вместо значений в printf([%d]) попробуете использовать ключ %p, чтобы вывести адрес.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.10.2016, 15:21
Michail97, опять вы меня радуете! Весьма грамотный подход.
Однако.
Строка 5
"array=(int**)malloc(n*sizeof(int));//выделяем место для массива указателей"
логически неверна (хотя случайно и приводит к правильному результату).
Надо sizeof(int *)
Ведь вы отводите память на указатели!

Добавлено через 3 минуты
Цитата Сообщение от Michail97 Посмотреть сообщение
ошибка памяти вылетает только на 9-ом элемента.
Дело случая. Просто случайно память на первые 8 элементов была не занята никем. Но, надеюсь, что вы понимаете, что такие штуки можно делать только в качестве экстремального эксперимента...

Добавлено через 1 минуту
Цитата Сообщение от Le0nX Посмотреть сообщение
(поправьте, если не прав)
Не буду. Все правильно.
4
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384
20.10.2016, 23:55  [ТС]
Байт, вы, как всегда, меня выручаете. =)

Добавлено через 2 часа 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
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
#include <stdio.h>
#include <malloc.h>
#include <locale.h>
#include <math.h>
 
int main()
{
   setlocale(LC_ALL,".1251");
   int **array;// указатель на указатели
   int i, j, n,sum;
   int done;
   printf("Введите кол-во строк квадратной целочисленной матрицы A:");
   scanf("%d",&n);// кол-во элементов указателей в массиве
   array=(int**)malloc(n*sizeof(int*));//выделяем место для массива указателей
   for(i=0;i<n;i++)
    {
    array[i]=(int*)malloc(n*sizeof(int));// выделяем место для столбцов при каждой итерации
    for(j=0;j<n;j++){
        printf("[%d][%d]=",i,j);
        scanf( "%d", &array[i][j]);
     }}
     for(i=0;i<n;i++){
        if(i>0) printf("\n");
        for(j=0;j<n;j++)
            printf("%d\t",array[i][j]);
     }
     for(i=0;i<n;i++){
            sum=0;
            done=1;
        for(j=0;j<n;j++)
        if(array[j][i]>0)sum+=array[j][i];
        else done=0;
        if(done==1) printf("\nСумма элементов %d-ого стобца равна: %d\n",i,sum);}
 
        // Организация суммирования побочных диагоналей над главной диагональю и выбор из них той, у которой сумма элементов наибольшая
 
        int sum1=0, k=0, s;
 
        for(i=1;i<n-1;i++)
            {
            s=i;
          while(1)
            {
          sum1+=abs(array[i][k]);
         i-=1;
         k+=1;
         if(s==k) break;
            }
            k=0;
         printf("%d\n",sum1);
         sum1=0;
         }
    return 0;}
Вот в последней части кода требуется подсчитать суммы модулей элементов верхних побочных диагоналей. Я не могу понять, где не так. Вообще что-то допереть не могу, как организовать такое.

Добавлено через 13 минут
Байт, написал по-другому - результат такой же
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(i=1;i<n-1;i++)
            {
            s=i;
          do
            {
          sum1+=abs(array[i][k]);
         i-=1;
         k+=1;
          }
        while(s!=k);
            k=0;
         printf("%d\n",sum1);
         sum1=0;
         }
Добавлено через 2 минуты
Байт, короче, я, походу, дурак.((

Добавлено через 1 час 6 минут
Байт, И так не катит
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        int sum1=0, k=0, s;
 
        for(i=1;i<n-1;i++)
            {
            s=i;
          while(s!=(k-1))
            {
          sum1+=abs(array[i][k]);
         i-=1;
         k+=1;
          }
 
            k=0;
         printf("%d\n",sum1);
         sum1=0;
         }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2016, 23:55
Помогаю со студенческими работами здесь

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

Создание динамического двухмерного массива
Как переписать следующий код на С void allocMatrix(int** &amp;ppMtx, const int nRow, const int nCol) { ppMtx = new int*; for...

Создание двухмерного динамического массива
Собственно сабж, как для одномерного это понятно. Создаётся double *X = new double; и удаляется delete X; А как сделать...

Вывод двухмерного динамического массива
Добрый день, суть программы в том, что пользователь вводит массив n*n, а программа выводит его, увеличив каждый элемент в два раза. ...

Сортировка двухмерного динамического массива
Доброго времени суток. Столкнулся с проблемой при сортировке двухмерного динамического массива, а именно: первые y-1 элементы (у - число...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru