Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Rikimaru
7 / 7 / 0
Регистрация: 25.09.2010
Сообщений: 31
#1

Перераспределение динамической памяти - C++

12.11.2010, 12:13. Просмотров 3862. Ответов 21
Метки нет (Все метки)

дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там все понятно, помогите найти ошибку в перераспределении)
C++
1
2
3
4
5
6
int**a=(*int)calloc(3,sizeff(*int));
         for(int i=0; i<3; i++)
             a[i]=(*int)calloc(5,sizeof(int));
         realloc(a, 5*sizeof(int*));
         for(int i=0; i<5; i++)
             realloc(a[i], 4*sizeof(int));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2010, 12:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перераспределение динамической памяти (C++):

Перераспределение динамической памяти - C++
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там...

Перераспределение памяти с new под объекты - C++
есть класс #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class tel_book { private: char *FIO; int count...

std::vector Перераспределение памяти - C++
Код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;tchar.h&gt; ...

Перераспределение памяти для стека - C++
Помогите решить задачку, реализовал стек, осталось решить задачку.. Задача состоит в следующем: реализовать перераспределение памяти,...

STL, deque Перераспределение памяти - C++
Есть книга, в ней написано такое о деке Можно ли пример увидеть, а-то чего-то непонятно. Пример когда все итераторы из-за...

С помощью чего можно представить динамический массив, чтобы исключить перераспределение памяти? - C++
С помощью чего можно представить динамический массив? Пробовал vector, но там перераспределение памяти. Я знаю, что можно зарезервировать...

21
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
12.11.2010, 12:35 #2
что значит sizeff???????
0
Rikimaru
7 / 7 / 0
Регистрация: 25.09.2010
Сообщений: 31
12.11.2010, 16:58  [ТС] #3
Цитата Сообщение от TheMachinist Посмотреть сообщение
что значит sizeff???????
опечатка
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
12.11.2010, 18:42 #4
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 <stdlib.h>
int main () {
 
 
 //Коль скоротреба перераспределять память, то думаем.т Массива 3 на 5 это 15 ячеек памяти. Массив 5 на 3
 //это тоже 15 ячеек. Для полного счастья на не хватает, чтобы эти 15 ячеек были не разбросаны, как попало
 //в памяти, а шли подряд
 
 //Поэтому выделяем их
 int* p= new int [15];
 
 //Теперь занимаемся массивом  3 на 5
 int**a=(int**)calloc(3,sizeof(int*));
 for(int i=0; i<3; i++) 
  a[i]= &p[i* 5];
 
 //Всё, теперь эти 15 ячеек массив 3 на 5 (3 строки по 5 столбцов)
 
 //А перераспределяем так:
 int**b=(int**)calloc(5,sizeof(int*));
 for(int i=0; i<5; i++) 
  b[i]= &p[i* 3];
 
 
 //Ну и удаляем потом память
 delete [] p;
 free (b);
 free (a);
 
 
 return 0;
                         
}
1
Day
1159 / 964 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
12.11.2010, 20:18 #5
Цитата Сообщение от Rikimaru Посмотреть сообщение
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там все понятно, помогите найти ошибку в перераспределении)
C++
1
2
3
4
5
6
int**a=(*int)calloc(3,sizeff(*int));
         for(int i=0; i<3; i++)
             a[i]=(*int)calloc(5,sizeof(int));
         realloc(a, 5*sizeof(int*));
         for(int i=0; i<5; i++)
             realloc(a[i], 4*sizeof(int));
Вот здесь for(int i=0; i<5; i++) realloc(a[i], 4*sizeof(int));при i>2 реаллокачивать нечего,
a[i] просто неизвестно кто, и при i>2 надо делать calloc

Добавлено через 1 минуту
И еще.
Надо
C
1
 a[i] = realloc(a[i], ....);
2
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
13.11.2010, 01:50 #6
Цитата Сообщение от Day Посмотреть сообщение
И еще.
Надо
C
1
 a[i] = realloc(a[i], ....);
нужен промежуточный указатель, realloc() может вернуть NULL

Цитата Сообщение от Rikimaru
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3
перевыделять нужно a, a[0], a[1], a[2] и довыделять a[3], a[4]
2
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
14.11.2010, 13:09 #7
Цитата Сообщение от Rikimaru Посмотреть сообщение
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там все понятно, помогите найти ошибку в перераспределении)
C++
1
2
3
4
5
6
int**a=(*int)calloc(3,sizeff(*int));
         for(int i=0; i<3; i++)
             a[i]=(*int)calloc(5,sizeof(int));
         realloc(a, 5*sizeof(int*));
         for(int i=0; i<5; i++)
             realloc(a[i], 4*sizeof(int));
C
1
2
3
4
5
6
7
8
9
// Allocating memory
int**a=(**int) calloc(3, sizeof(int*));
for(int i = 0; i < 3; ++i)
    a[i]=(*int) calloc(5, sizeof(int));
 
// Re-allocating memory
a = (int**) realloc((int *) a, 5 * sizeof(int*));
for(int i = 0; i < 5; ++i)
    a[i]=calloc(3, sizeof(int));
Освободить думаю сможешь сам
Есть вопросы задавай
2
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
14.11.2010, 22:49 #8
C
1
a = (int**) realloc((int *) a, 5 * sizeof(int*));
нельзя так делать, нужен промежуточный указатель

смотри, в a был указатель на память, ты начал выделять realloc'ом новый кусок побольше и памяти не хватило, realloc возвращает NULL и что ?
в а записывается NULL, а куда делся кусок, который там был ?
потерлся - утечка памяти
2
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
15.11.2010, 00:28 #9
Цитата Сообщение от accept Посмотреть сообщение
нельзя так делать, нужен промежуточный указатель
то есть вот так?
C
1
2
3
4
5
6
7
8
9
10
// Allocating memory
int**a=(**int) calloc(3, sizeof(int*));
for(int i = 0; i < 3; ++i)
    a[i]=(*int) calloc(5, sizeof(int));
 
// Re-allocating memory
int **b = (int**) realloc((int *) a, 5 * sizeof(int*));
if (!b) // освобождаем память по указателю a и завершаем программу с ошибкой
for(int i = 0; i < 5; ++i)
    b[i]=calloc(3, sizeof(int));
Еще возник вопрос если я выделяю выше описанным образов, то есть сначала выделяю память для массива с 3 указателей, потом в значение этого указателя записываю поочередно указатель на массив который состоит с 5 значений
Вопрос - куда деваются адреса после вызова realloc, я сделал вывод адресов до и после realloc'а результаты разные для верхнего массива?
надеюсь ясно выразился...
2
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
15.11.2010, 02:14 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
если b == NULL, то мы ничего не делаем, а если b != NULL, то мы делаем a[i] = b
можно из цикла выйти, можно вывести сообщение и программу завершить, главное нельзя сразу в a[i] записывать, а то потеряются данные, которые там были до этого (если перевыделение памяти не состоится) и сам указатель на ту память, которая там была, тоже

Добавлено через 4 минуты
Цитата Сообщение от norge_goth
Вопрос - куда деваются адреса после вызова realloc
C89
Код
4.10.3.4 The realloc function

Synopsis

         #include <stdlib.h>
         void *realloc(void *ptr, size_t size);

Description

   The realloc function changes the size of the object pointed to by
ptr to the size specified by size .  The contents of the object shall
be unchanged up to the lesser of the new and old sizes.  If the new
size is larger, the value of the newly allocated portion of the object
is indeterminate.  If ptr is a null pointer, the realloc function
behaves like the malloc function for the specified size.  Otherwise,
if ptr does not match a pointer earlier returned by the calloc ,
malloc , or realloc function, or if the space has been deallocated by
a call to the free or realloc function, the behavior is undefined.  If
the space cannot be allocated, the object pointed to by ptr is
unchanged.  If size is zero and ptr is not a null pointer, the object
it points to is freed.

Returns

   The realloc function returns either a null pointer or a pointer to
the possibly moved allocated space.
понял да, possibly moved

Добавлено через 5 минут
знаешь, там еще реаллочить нужно строки (те, которые были), уменьшая до длины три
а новые строки просто выделить с длиной три, и всего две штуки
3
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
16.11.2010, 12:05 #11
Цитата Сообщение от accept Посмотреть сообщение
знаешь, там еще реаллочить нужно строки (те, которые были), уменьшая до длины три
а новые строки просто выделить с длиной три, и всего две штуки
кажись сделано перераспределение и обработка всех последствий
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
#include <stdio.h>
#include <stdlib.h>
 
void freeAfter(int *ptr, int k);
 
int main(void)
{
    const int m = 3, n = 5;
    int **vect;
    int **a;
 
    // Allocating memory for m * n
    if (!(vect = (int** ) malloc(m * sizeof(int*))))
        exit(1);
 
    for (int i = 0; i < m; ++i)
        if(!(vect[i] = (int *) malloc(n * sizeof(int))))
        {
            free((int* )vect);
            exit(1);
        }
 
    // Reallocating memory for n * m
    if (!(a = (int** ) realloc((int* )vect, n * sizeof(int*))))
    {
        // Delete Allocated memory
        freeAfter((int* )vect, m);
        free((int* )vect);
        exit(1);
    }
 
    vect = a;
 
    for (int i = 0; i < m; ++i)
        if(!(vect[i] = (int *) realloc(vect[i], m * sizeof(int))))
        {
            freeAfter((int* )vect, m);
            free((int* )vect);
            exit(1);
        }
 
    for(int i = m; i < n; ++i)
        if(!(vect[i] = (int *) malloc(m * sizeof(int))))
        {
            freeAfter((int* )vect, m);
            free((int* )vect);
            exit(1);
        }
 
    // Delete Allocated memory
    for (int i = 0; i < n; ++i)
        free(vect[i]);
    free((int* )vect);
 
    printf("\n");
    system("PAUSE");
    return 0;
 
}
 
void freeAfter(int *ptr, int k)
{
    for (int i = 0; i < k; ++i)
        free((void* )ptr[i]);
}
2
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
16.11.2010, 13:41 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
if (!(a = (int** ) realloc((int* )vect, n * sizeof(int*))))
vect - указатель второго порядка
вообще не надо приводить
C
1
if (!(a = (int** ) realloc(vect, n * sizeof(int*))))
C
1
free(vect);
приведение будет выполнено автоматически (аргументы функции приводятся к тем типам, которые указаны в прототипе функции)

C
1
if(!(vect[i] = (int *) realloc(vect[i], m * sizeof(int))))
здесь промежуточного указателя нет, в принципе тут выход из программы
но вот когда выход из программы не делается, необходим промежуточный указатель, чтобы указатель на старую память сохранить в случае NULL
3
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
16.11.2010, 21:18 #13
Цитата Сообщение от accept Посмотреть сообщение
здесь промежуточного указателя нет, в принципе тут выход из программы
но вот когда выход из программы не делается, необходим промежуточный указатель, чтобы указатель на старую память сохранить в случае NULL
еще такой вопрос - если мы сразу выходим с программы можно не освобождать память занятую ранее другим процессом? то есть код
C
1
2
3
4
5
6
7
for(int i = m; i < n; ++i)
        if(!(vect[i] = (int *) malloc(m * sizeof(int))))
        {
            freeAfter((int* )vect, m);
            free((int* )vect);
            exit(1);
        }
а записать просто:
C
1
2
3
for(int i = m; i < n; ++i)
        if(!(vect[i] = (int *) malloc(m * sizeof(int))))
              exit(1);
1
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
16.11.2010, 22:02 #14
Осторожнее с терминами. Другой процесс- это другой процесс, в твоей программе создаётся только один процесс. Если он заканчивается, вся выделенная память возвращается оси.
Здесь читаем
По завершении процесса его код и выделенные ему ресурсы удаляются из памяти.
2
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
16.11.2010, 22:03 #15
вообще принято освобождать, так как программа может стать частью другой программы

kravam, там же только про уиндоус
2
16.11.2010, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2010, 22:03
Привет! Вот еще темы с ответами:

Вопрос по динамической памяти - C++
мне надо создать масив содержащий структуры. У меня вот код какой: vec *fild;//vec это название структуры конструктор ...

Удаление динамической памяти - C++
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи...

Удаление динамической памяти - C++
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF; IDirect3DVertexBuffer9* vertexBuffer; ...

Выделение динамической памяти - C++
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...


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

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

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