Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704

Динамический массив массивов, realloc, размер по указателю на имя массива

22.08.2015, 00:03. Показов 4436. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
    Arr = (double**)realloc(Arr, SizeH * sizeof(**Arr)); j = 0;
    while (j < SizeH) Arr[j] = (double*)realloc(Arr[j], SizeW * sizeof(**Arr));
 
    while (j < SizeH) {
        while (i < SizeW) {
            Arr[j][i] = (double)127 - rand() % 256;
            printf("%7.0f ", Arr[j][i]); i++;
        } puts(""); i = 0;
    } j = 0;
 
    system("pause"); j = 0; while (j < SizeH) { free(Arr[j]); j++; } free(Arr);
Помогите исправить

Добавлено через 4 часа 13 минут
Почему с malloc работает, а при изменении размера нет? :-(

C
1
2
    Arr = (int **)malloc(m * sizeof(**Arr)); j = 0; 
    while (j < m) { Arr[j] = (int *)malloc(n * sizeof(**Arr)); j++; }
Типы данных тут для примера написаны, это не важно
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2015, 00:03
Ответы с готовыми решениями:

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

Динамический 2-размерный массив (malloc, realloc)
Здравствуйте, подскажите, пожалуйста, как мне решить вот эту задачу: Задание: Пользователь задаёт количество строк матрицы, затем...

Класс Вектор, поля класса: n- количество элементов массива, a - имя массива целых чисел(массив динамический)
Дана задача. Класс Вектор, поля класса: n- количество элементов массива, a - имя массива целых чисел(массив динамический). Создать...

7
Музыка нас Связала
 Аватар для Fonduee
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
22.08.2015, 00:24
Хотелось бы конкретики, что хотите, что именно не получается, сыплются ли ошибки? Понимаю, массивы в динамическом массиве статичны? Тогда:

C
1
realloc(array, new_size * (sub_array_size * sizeof(double))
где new_size - это новое кол-во массивов.
0
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
22.08.2015, 00:43  [ТС]
а) у меня имеется двумерный динамический массив массивов, мне нужно изменить его размеры;

б) тоже самое, что и в пункте "а", но изначальный размер равен нулю;

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

Добавлено через 7 минут
ошибки сыпятся при выделении памяти на втором шаге, realloc в цикле где, падает сразу на первом цикле
0
Музыка нас Связала
 Аватар для Fonduee
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
22.08.2015, 10:12
Цитата Сообщение от Ваю Посмотреть сообщение
realloc является дельта величиной к malloc

не является, т.е. нужно указывать абсолютную величину.

Цитата Сообщение от Ваю Посмотреть сообщение
Arr = (double**)realloc(Arr, SizeH * sizeof(**Arr)); j = 0;

Мне ваша структура не известна, но выделять память нужно под поинтеры, а не под элементы.

Цитата Сообщение от Ваю Посмотреть сообщение
Arr = (int **)malloc(m * sizeof(**Arr)); j = 0;

Тоже самое и здесь. См. рабочий пример:

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
#include <stdio.h>
#include <stdlib.h>
 
void my_free(double** array, int size)
{
    for (int i = 0; i < size; ++i) { free(array[i]); } free(array);
}
 
void my_print(double** array, int rows, int cols)
{
    for (int i = 0, max = 0; i < rows; ++i)
    {
        max = (rows == cols) ? rows : (i < cols) ? cols : (i & 1) ? rows : cols;
        for (int j = 0; j < max; ++j)
        {
            printf("%.2f ", array[i][j]);
        }
 
        printf("\n");
    }
}
 
int main(int argc, char** argv)
{
    int old_size = 3;
    int new_size = 9;
 
    double** array = (double **) malloc(old_size * sizeof(double *)); // old_size x old_size
 
    for (int i = 0; i < old_size; ++i)
    {
        array[i] = (double *) malloc(old_size * sizeof(double));
 
        for (int j = 0; j < old_size; ++j)
        {
            array[i][j] = i;
        }
    }
 
    puts("my old array"); my_print(array, old_size, old_size);
 
    array = (double **) realloc(array, new_size * sizeof(double *)); // new_size x old_size
 
    for (int i = 3; i < new_size; ++i)
    {
        array[i] = (double *) malloc(old_size * sizeof(double));
 
        for (int j = 0; j < old_size; ++j)
        {
            array[i][j] = i;
        }
 
        if(i & 1)
        {
            array[i] = (double *) realloc(array[i], new_size * sizeof(double));
            for (int j = 3; j < new_size; ++j)
            {
                array[i][j] = i;
            }
        }
    }
 
    puts("my new array"); my_print(array, new_size, old_size);
    
    my_free(array, new_size); return 0;
 
}
1
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
22.08.2015, 16:30
Ваю, в realloc (как и остальных -alloc() ) нужно указывать размер элементов, которые будут в массиве. Двойной указатель будет содержать начало адреса массива одинарных указателей, поэтому (учитывая, что Arr — двойной указатель):

C
1
Arr = realloc(Arr, N * sizeof(TypeName*));
Где N — желаемое кол-во одномерных массивов, TypeName — тип отдельных данных (int, float...).
0
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
22.08.2015, 20:38  [ТС]
Разобрался, опять несовсем очевидные косяки

прошлый раз в другой теме в этом же месте была проблема с тем, что при входящем значении адреса массива в realloc при изменении размера массива НЕ ДОЛЖНО БЫТЬ = NULL, иначе данные будут переброшены в новое место и для исправления проблемы требовалась циклическая перезапись значения дабы не потерять адрес

теперь всё наоборот - при начальной инициализации памяти её содержимое затирается "рандомной" <cencored/>, если быть точным, то это значение = 0xCDCDCDCD, ясен пень, что по этому адресу изначально никаких данных нет и там ничего не выделено, а realloc при выделении памяти для строк пытается изменить размер того, чего нет и в результате этого падает, для исправления косяка нужно предварительно в ручную повторно инициализировать **Arr нулями, дабы realloc понимал, что нужно найти новый свободный кусок памяти и занять его под данные

при отсутствии строки while (j < SizeH) { Arr[j] = NULL; j++; } j = 0; будет ошибка: Необработанное исключение по адресу 0x100CB2CE (msvcr120d.dll) в M1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDC8.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void main() {
    setlocale(0, "ru-ru"); srand((unsigned int)time(0)); 
 
    char i = 0, j = 0, SizeH = 4, SizeW = 5; double **Arr = NULL;
 
    Arr = (double**)realloc(Arr, SizeH * sizeof(*Arr)); j = 0;
    while (j < SizeH) { Arr[j] = NULL; j++; } j = 0; 
    while (j < SizeH) { Arr[j] = (double*)realloc(Arr[j], SizeW * sizeof(**Arr)); j++; } j = 0;
 
    while (j < SizeH) { i = 0; 
        while (i < SizeW) {
            Arr[j][i] = (double)127 - rand() % 256;
            printf("%7.0f ", Arr[j][i]); i++;
        } puts(""); i = 0;
    } puts(""); j = 0;
 
    system("pause"); j = 0; while (j < SizeH) { free(Arr[j]); j++; } free(Arr);
}
Вопрос до кучи, если можно. В си есть функция, инициализации/затирания памяти указанным значением, входными данными у неё являются адрес, длина и заплонитель, возможно, она работает со строками, кто помнит название - скажите пожалуйста, я использовал это всего раз, больше не приходилось и забыл название
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
22.08.2015, 20:51
Ваю, http://www.cplusplus.com/reference/cstring/memset/
1
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 704
30.08.2015, 15:28  [ТС]
Ну и трёхмерный массив, мож кому будет интересно, D - глубина, H - высота, W - ширина

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
    //malloc
    Arr = (long double***)malloc(SizeD * sizeof(*Arr));
    for (k = 0; k < SizeD; k++) {
        Arr[k] = (long double**)malloc(SizeH * sizeof(**Arr));
        for (j = 0; j < SizeH; j++) {
            Arr[k][j] = (long double*)malloc(SizeW * sizeof(***Arr));
            memset(Arr[k][j], 0, SizeW * sizeof(***Arr));
        }
    }
 
    //realloc, не для цикла, для цикла memset() нужно убрать и 
    //начальная память должна быть выделена
    Arr = (long double***)realloc(Arr, SizeD * sizeof(*Arr));
    memset(Arr, 0, SizeD * sizeof(*Arr));
    for (k = 0; k < SizeD; k++) {
        Arr[k] = (long double**)realloc(Arr[k], SizeH * sizeof(**Arr));
        memset(Arr[k], 0, SizeH * sizeof(**Arr));
        for (j = 0; j < SizeH; j++) {
            Arr[k][j] = (long double*)realloc(Arr[k][j], SizeW * sizeof(***Arr));
            memset(Arr[k][j], 0, SizeW * sizeof(***Arr));
        }
    }
    
    //free
    for (k = 0; k < SizeD; k++) {   
        for (j = 0; j < SizeH; j++) free(Arr[k][j]); free(Arr[k]); 
    } free(Arr); Arr = NULL;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2015, 15:28
Помогаю со студенческими работами здесь

Динамический массив через realloc - ошибка преобразования типов
Здравствуйте ! я начинающий программист. подскажите пожалуйста кто может пишу в с-шном файле где забиты отдельные функции. ...

Используя malloc и realloc создать двумерный динамический массив
Используя malloc и realloc, помогите написать часть кода для ввода массива строк,количество строк и символов в строках неизвестно.

Дан динамический одномерный массив размера N, изменить размер массива до M
Что-то запуталась, как это делать, может, кто-нибудь знает? За помощь буду очень благодарна:)

Как уменьшить размер динамического массива через realloc?
Есть такой вариант, но он почему-то не работает. void remLastElement(int *array, int size) { int *newArray = (int*...

Создать динамический массив, в котором по одному, каждый раз увеличивается размер массива
Используя malloc и realloc, помогите написать программу реальных чисел массив ,,Array&quot; со 100 элементами . Можно заполнить N элементов...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru