3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Динамическое выделение памяти под структуры13.10.2016, 11:15. Показов 1345. Ответов 4
Метки нет (Все метки)
Есть вот такая структура:
Я думаю что нельзя, хотя написал небольшую тестовую программку и всё работает. Но работает я думаю из-за того, что данные структуры занимают очень мало места в памяти и при выделении памяти они все будут в одном месте, поэтому меняя указатель head - head-- или head++ мы будем перемещаться по структурам. Но если бы структуры были очень большими и их было очень много, то, есть вероятность, что одна часть их будет расположена в одном месте, а другая в другом месте памяти и тогда перемещаться по структурам меняя head не получиться. Хотелось бы узнать правильно я думаю или ошибаюсь! Правильно перемещаться по структурам надо наверное так:
Следующий непонятный момент вот какой. После выделения памяти под структуры и поработав с ними, освобождаю память free(head), head в данном случае указывает на самую верхнюю структуру. В интернете вычитал вот что: free Код
*** glibc detected *** ./yrok161: double free or corruption (out): 0x0812e020 *** ======= Backtrace: ========= /lib/libc.so.6[0xb35231] ./yrok161[0x8048654] /lib/libc.so.6(__libc_start_main+0xe6)[0xadba66] ./yrok161[0x8048411] ======= Memory map: ======== 003e7000-00411000 r-xp 00000000 08:02 2237624 /lib/libgcc_s-4.4.0-20090506.so.1 00411000-00412000 rw-p 00029000 08:02 2237624 /lib/libgcc_s-4.4.0-20090506.so.1 00a77000-00a78000 r-xp 00a77000 00:00 0 [vdso] 00a9d000-00abd000 r-xp 00000000 08:02 2236420 /lib/ld-2.10.1.so 00abd000-00abe000 r--p 0001f000 08:02 2236420 /lib/ld-2.10.1.so 00abe000-00abf000 rw-p 00020000 08:02 2236420 /lib/ld-2.10.1.so 00ac5000-00c30000 r-xp 00000000 08:02 2236959 /lib/libc-2.10.1.so 00c30000-00c31000 ---p 0016b000 08:02 2236959 /lib/libc-2.10.1.so 00c31000-00c33000 r--p 0016b000 08:02 2236959 /lib/libc-2.10.1.so 00c33000-00c34000 rw-p 0016d000 08:02 2236959 /lib/libc-2.10.1.so 00c34000-00c37000 rw-p 00c34000 00:00 0 08048000-08049000 r-xp 00000000 08:02 7955556 08049000-0804a000 rw-p 00000000 08:02 7955556 0812e000-0814f000 rw-p 0812e000 00:00 0 [heap] b7efe000-b7f00000 rw-p b7efe000 00:00 0 b7f29000-b7f2b000 rw-p b7f29000 00:00 0 bfa15000-bfa2a000 rw-p bffeb000 00:00 0 [stack] Аварийный останов Вот моя небольшая тестовая программка:
0
|
13.10.2016, 11:15 | |
Ответы с готовыми решениями:
4
Динамическое выделение памяти Динамическое выделение памяти под структуры Структуры. Динамическое выделение памяти Структуры и динамическое выделение памяти. |
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|||||||||||
13.10.2016, 15:47 | 2 | ||||||||||
Нет, т.к. malloc() может выделять память из разных областей. Видимо, в вашем случае malloc() вызывался подряд и в пределах одной страницы, поэтому и выделял память подряд. Но гарантировать это нельзя и лучше так не делать, а то потом замучаетесь искать, где ошибка происходит.
Да. Ну и надо проверять, что выбираемая структура не NULL. Можно использовать два указателя:
0
|
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
|
|
13.10.2016, 16:23 | 3 |
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|
13.10.2016, 19:58 | 4 |
Честно говоря, не силён в названиях, но судя по википедии, да, это двусвязный список.
Добавлено через 1 минуту Так же как пример автора, похоже, является односвязным списком, который описан выше в той же статье.
1
|
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
|
||||||
13.10.2016, 23:08 [ТС] | 5 | |||||
Разобрался. Всем огромное спасибо за помощь!
Может кому пригодиться вот работоспособный и правильный вариант:
0
|
13.10.2016, 23:08 | |
13.10.2016, 23:08 | |
Помогаю со студенческими работами здесь
5
Создайте динамическое выделение памяти в структуры Динамическое выделение памяти для структуры в функции Динамическое выделение памяти под массив Динамическое выделение памяти под структуру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |