7 / 7 / 0
Регистрация: 25.09.2010
Сообщений: 31
|
||||||
1 | ||||||
Перераспределение динамической памяти12.11.2010, 12:13. Показов 8557. Ответов 21
Метки нет (Все метки)
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там все понятно, помогите найти ошибку в перераспределении)
1
|
12.11.2010, 12:13 | |
Ответы с готовыми решениями:
21
Перераспределение динамической памяти Перераспределение памяти Перераспределение памяти Перераспределение памяти с new под объекты |
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
|
|
12.11.2010, 12:35 | 2 |
что значит sizeff???????
0
|
7 / 7 / 0
Регистрация: 25.09.2010
Сообщений: 31
|
|
12.11.2010, 16:58 [ТС] | 3 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
|
||||||
12.11.2010, 18:42 | 4 | |||||
1
|
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
|
||||||
12.11.2010, 20:18 | 5 | |||||
Вот здесь for(int i=0; i<5; i++) realloc(a[i], 4*sizeof(int));при i>2 реаллокачивать нечего,
a[i] просто неизвестно кто, и при i>2 надо делать calloc Добавлено через 1 минуту И еще. Надо
2
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||
14.11.2010, 13:09 | 7 | |||||
Есть вопросы задавай
2
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
14.11.2010, 22:49 | 8 | |||||
смотри, в a был указатель на память, ты начал выделять realloc'ом новый кусок побольше и памяти не хватило, realloc возвращает NULL и что ? в а записывается NULL, а куда делся кусок, который там был ? потерлся - утечка памяти
2
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||
15.11.2010, 00:28 | 9 | |||||
то есть вот так?
Вопрос - куда деваются адреса после вызова realloc, я сделал вывод адресов до и после realloc'а результаты разные для верхнего массива? надеюсь ясно выразился...
2
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
15.11.2010, 02:14 | 10 |
Сообщение было отмечено как решение
Решение
если b == NULL, то мы ничего не делаем, а если b != NULL, то мы делаем a[i] = b
можно из цикла выйти, можно вывести сообщение и программу завершить, главное нельзя сразу в a[i] записывать, а то потеряются данные, которые там были до этого (если перевыделение памяти не состоится) и сам указатель на ту память, которая там была, тоже Добавлено через 4 минуты
Сообщение от norge_goth
Код
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. Добавлено через 5 минут знаешь, там еще реаллочить нужно строки (те, которые были), уменьшая до длины три а новые строки просто выделить с длиной три, и всего две штуки
3
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
||||||
16.11.2010, 12:05 | 11 | |||||
кажись сделано перераспределение и обработка всех последствий
2
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|||||||||||||||||||||
16.11.2010, 13:41 | 12 | ||||||||||||||||||||
Сообщение было отмечено как решение
Решение
вообще не надо приводить
но вот когда выход из программы не делается, необходим промежуточный указатель, чтобы указатель на старую память сохранить в случае NULL
3
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
|||||||||||
16.11.2010, 21:18 | 13 | ||||||||||
еще такой вопрос - если мы сразу выходим с программы можно не освобождать память занятую ранее другим процессом? то есть код
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
|
|
16.11.2010, 22:02 | 14 |
Осторожнее с терминами. Другой процесс- это другой процесс, в твоей программе создаётся только один процесс. Если он заканчивается, вся выделенная память возвращается оси.
Здесь читаем По завершении процесса его код и выделенные ему ресурсы удаляются из памяти.
2
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
|
|
16.11.2010, 22:35 | 16 |
Навскидку если, я очень сильно сомневаюсь, что в линуксе оперативная память, отданная процессу по его окончании не будет возвращена оси БЕЗУСЛОВНО.
Второй раз вынужден попроситьбыть точнее с терминами. Что значит "программа может стать частью другой программы"? Если имеется ввиду отношение отец- сын, то все процессы, включая заявленный по определению чьи-то дети, либо проводника либо cmd (это в общем случае) или хитрого автроского процесса (это в частности). Автоматическое освобождение памяти (по убиению процесса) не повлияет ни на работу ни отцов ни детей ни стороннних прог, если конечно последние не используют диверсантский приём типа "запись в адресное пространство стороннего процесса" Но в этом случае как показывает практика они НИЧЕГО не смогут туда записать (у меня, например, не срабатывает api-функция VirtualProtectEx). Следовательно, память действительно возвращается оси независимо от того, сколько прог её используют. ...А так-то конечно, лучше принудительно возвращать память оси
2
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
|
20.11.2010, 22:20 | 18 |
почитал я эту информацию, возник вопрос так если мы создаем внутри одного процесса несколько потоков(трэдов) получается тоже что и при создании дочерных процессов(я имею ввиду распаралеливание выполнения программы)?
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
|
|
20.11.2010, 22:38 | 19 |
Нет. Ну тут много различий.
Вот одно из них, важное. Каждый поток должен иметь хотя бы ОДИН процесс. Если не будет ни одного потока, процесс убиется. А теперь попробуем провести аналогию с дочерними процессами-, нет, не то же самое. Если исчезнут все дочерние процессы, отцовский процесс как работал так и будет работать. (Кстати, верно и обратное. Если ты убьёшь процесс, это автоматом означает убиение всх потоков этого процесса. Но убитие процесса отнюдь не означает убитие всех его дочерних процессов) А вообще это всё там расписано. Попробуй побольше почитать. Добавлено через 5 минут Если уж сравнивать поток, то с функцией. ОНа имеет начало и конец в адресном пространстве процесса. Ну, то же самое с потоком. Отличие в том, что пока одна функция не закончится, другая не выполнится. Вот псевдокод: funktsia_1; funktsia_2; funktsia_3; А если ты вместо них оеперь напишешь потоки, то они быдут выполняться ОДНОВРЕМЕННО. Ну, как одновременно-то один, то второй, то третий. Это уж как система распределит между ними время potok_1; potok_2; potok_3; Но, по-моему можно так под написать, что второй поток не выполнится, пока не закончится первый. Но это уже частный случай. А в общем если брать, то они будут выполняться ПСЕВДООДНОВРЕМЕННО. Вот в этом их отличие от функций. Ну и другие ещё наверное есть
1
|
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
|
|
20.11.2010, 22:44 | 20 |
понятно, но я не то имел ввиду...
там сказано что ядро выделяет квантованное время для потока, то есть если мы будем иметь 1 процесс состоящий с двух потоков, а с другой стороны родительский процесс с дочерным процессом, которые имеют по одному потоку - в итоге и там и там будет отведено по 2 кванта процессорного времени(в сумме)?
1
|
20.11.2010, 22:44 | |
20.11.2010, 22:44 | |
Помогаю со студенческими работами здесь
20
std::vector Перераспределение памяти Перераспределение памяти для стека STL, deque Перераспределение памяти С помощью чего можно представить динамический массив, чтобы исключить перераспределение памяти? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |