Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71

Динамическая память. Что такое realloc?

18.11.2014, 08:39. Показов 1553. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Препод ни в какую не принимает ответы.Я начинающий(занимаюсь 1.5 месяца)
Помогите пожалуйста,кто знает правильно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *s, *p, c;
    int i = 0;
    s = (char*)malloc(100);
    cout << "Введите строку: ";
    while (1){
        c = _getch();
        if (c == '.')break; 
        putchar(c);
        p = (char*)realloc(s,100);
        p[i] = c;
        p[i + 1] = 0;
        s = p; 
        i++;
    }
Вопрос 1: p = (char*)realloc(s,100); Что такое p и что такое s? Чем различаются p и s//этот вопрос писал на форуме мне ответили,но он сказал все равно не верно.
Вопрос 2: s = p //Я отвечал указателю s присваивается значение указателя p;Верно?

Объясните пожалуйста.Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2014, 08:39
Ответы с готовыми решениями:

Азы: статическая память, динамическая память, автоматическая память
столько раз приходистя возвращаться к началу, и все благодаря моим преподавателям, которые не давали задавать вопросы на парах, а если это...

Что такое логическая память ПК
Ребята,привет помогите,пожалуйста, завтра экзамен по информатике нужен ответ что такое логическая память ПК в гугле ниче не нашел

Что такое дополнительная память
Что такое дополнительная память?

18
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 08:41
Sergooor, документацию читали?
http://www.opennet.ru/cgi-bin/... ic=realloc
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
18.11.2014, 09:15  [ТС]
Да,читал.Вот что я ему ответил.Если я не прав пожалуйста напишите как верно.
p = (char*)realloc(s,100);
p - указатель на на новый блок памяти размером 100
s- указатель на начало блока памяти размеров 100
А в чем отличие указателей s и p затрудняюсь.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 09:22
Sergooor, если взять отдельную строчку, то да: s - указатель на старый блок, p - на новый.
Только логики в алгоритме нет. Зачем выделять 100 байтов памяти, а затем перевыделять столько же?
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
18.11.2014, 09:32  [ТС]
Ой в malloс(1) должно быть.
Про отдельную строчку он говорит не верно(про realloc) мол по другому все.
Еще спрашивает в чем разница между p и s?И куда записывается p и куда s.Как ему ответить?
А про s=p я верно сказал?Или ту ошибка?(то что,указателю s присваивается значение указателя p)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 10:06
Цитата Сообщение от Sergooor Посмотреть сообщение
А про s=p я верно сказал?Или ту ошибка?(то что,указателю s присваивается значение указателя p)
Все ок, после этого присваивания оба указателя указывают на одну и ту же область памяти.
Цитата Сообщение от Sergooor Посмотреть сообщение
Еще спрашивает в чем разница между p и s?И куда записывается p и куда s.Как ему ответить?
При такой формулировке вопроса мне непонятно какой ответ ожидается.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
18.11.2014, 10:08
Цитата Сообщение от Sergooor Посмотреть сообщение
Да,читал.Вот что я ему ответил.Если я не прав пожалуйста напишите как верно.
p = (char*)realloc(s,100);
p - указатель на на новый блок памяти размером 100
s- указатель на начало блока памяти размеров 100
А в чем отличие указателей s и p затрудняюсь.
Вам же вроде ясно объясняли, что после такого вызова 'realloc' указатель 's' в общем случае становится "мусором" (если 'realloc' прошел успешно). А вы говорите, что мол "s - указатель на начало блока памяти размеров 100". Это не верно.

В общем случае 'realloc' имеет право перенести блок в новое место в памяти, а старая память будет полностью освобождена. Указатель 'p' в такой ситуации будет указывать на новый блок, а указатель 's' останется указывать на старое, уже освобожденное место. Указатель, указывающий на освобожденную память можно считать "мусором".
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
18.11.2014, 19:51  [ТС]
а еслисделать через 1 указатель все ) будет str= malloc(1);
и потом
str = realloc(str,100);

То все объяснения аналогично будет?Или как то по-другому?

Добавлено через 4 часа 46 минут
Тогда в этом случае получается, что новый и старый блоки памяти будут начинаться с одинакового адреса ?

Добавлено через 1 час 40 минут
Или нет?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
18.11.2014, 19:57
Цитата Сообщение от Sergooor Посмотреть сообщение
Тогда в этом случае получается, что новый и старый блоки памяти будут начинаться с одинакового адреса ?
это уже как менеджеру памяти угодно будет
str будет указывать на выделенный блок памяти
а уж совпадает он с предыдущим или нет кого это волнует
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
19.11.2014, 13:21  [ТС]
str( указатель на новый блок памяти) = realloc(str(указатель на освобожденную память т.е как писал другой человек мусор),100);

ТАК да?

Добавлено через 16 часов 56 минут
ТО что вы мне написали препод сказал БЛИЗКО, но не верно.Что делать?Кто нибудь из знающий профи может ответить?
он щас мне сказал делать через 1 указатель str=realloc(str,100) как ему обьяснить верно
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
19.11.2014, 14:11
Sergooor, мне очень было бы интересно узнать чем его не устраивает описание из гугла (например из русскоязычного цпп референса)...
Цитата Сообщение от Sergooor Посмотреть сообщение
сказал делать через 1 указатель str=realloc(str,100) как ему обьяснить верно
Так и объясните: что вот, мол, если вдруг случится Адъ и Израиль и нам не хватает памяти например, то вернувшийся из realloc-а нулевой указатель запишется в str и мы потеряем армейским способом все полимеры лишимся доступа к исходным данным, ранее располагавшимся по указателю.
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
19.11.2014, 15:24  [ТС]
Я ему примерно так говорил уже)тоже не нравится)он конкретно спрашивает
str(что это )=realloc(str(и что вот это),100) и сегодня еще спросил почему так можно писать?
И сказал почему-то иди читай передачу параметров по адресу и по значению(хотя это только будем изучать в дальнейшем)
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
19.11.2014, 15:56
Вот честно. Вообще не понимаю какие ответы ему нужны... Могу посоветовать вам попросить его задать вопрос в письменном виде (подробный) если он хочет точный ответ. Иначе это какая-то фигня получается.
1
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
19.11.2014, 16:32  [ТС]
Возможно я сейчас неверно его перецитирую но он сказал мне вот что:вот вы говорите,что
p = (char*)realloc(s,100) p указатель новый блок а s указатель на старый,

но если я запишу так str = (char*)realloc(str,100) то это тоже работает. и блок памяти тот же


Как то так сказал.

Добавлено через 10 минут
Ладно.Скажите тогда пожалуйста как работает realloc с такой записью и все)Что вовзрашает,и что происходить с параметрами
str=realloc(str,100)
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
19.11.2014, 16:44
примерно как реализован realloc(там все сложнее)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
size_t __internal_size_of_block(void*) {
// внутренняя функция возвращает размер блока памяти
    return ....
}
 
void* realloc(void* src, size_t nsize) {
    void* tmp;
    tmp = malloc(nsize);
    if(tmp != NULL) { // выделение памяти не провалилось
        if( src!= NULL) {
            memcpy(tmp, src, __internal_size_of_block(src));
            free(src);
        }
    }
    return tmp;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
19.11.2014, 16:48
Лучший ответ Сообщение было отмечено Sergooor как решение

Решение

Цитата Сообщение от Sergooor Посмотреть сообщение
но если я запишу так str = (char*)realloc(str,100) то это тоже работает. и блок памяти тот же
Он тебя путает специально.
Блоки памяти разные. Просто указатель один.
При передаче в realloc, str, который в параметре, указывает на старый блок памяти.
Потом идет работа функции realloc, она в общем случае выделяет новый блок, а старый освобождает. Пока мы не присвоили результат работы realloc некоему указателю, str указывает на освобожденную память (все так же как и в других примерах, которые объясняли выше). После присвоения результата работы realloc указателю str, он начинает указывать на новый блок памяти. Короче говоря, здесь все тоже самое, что и в предыдущих примерах, просто вместо двух экземпляров указателей используется один.
Здесь важно понимать, что значение указателя в параметре копируется при передаче в realloc (т.е. realloc не меняет значение адреса, хранимого в str, через свой параметр).
2
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
19.11.2014, 16:54  [ТС]
вот он наверно от меня последнюю строчку ждал вашего ответа
0
19.11.2014, 18:15

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Он тебя путает специально.
Вот пока не прозвучала эта фраза, я вообще не понимал что происходит. Потому что
Цитата Сообщение от DrOffset Посмотреть сообщение
Короче говоря, здесь все тоже самое, что и в предыдущих примерах
Поэтому и не понимал какие тут еще могут быть вопросы. Все ведь предельно тупо и просто.

0
0 / 0 / 1
Регистрация: 29.03.2014
Сообщений: 71
19.11.2014, 19:04  [ТС]
в пятницу к нему пойду )озвучу ответ последний)если не правильно скажет, я вообще не знаю чо делать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2014, 19:04
Помогаю со студенческими работами здесь

Что такое дополнительная память
Что такое дополнительная память? (Архитектура Компютера) где то 20-30 страниц нужен реферат ,с меня шоколадка :)

Что такое логическая память?
Возник вопрос, что такое логическая память??

Так что же такое виртуальная память?
Тут даётся следующее определение: Получается, что виртуальная память = физическая (оперативная) память + файл подкачки. На работе...

Освобождает ли realloc память?
Вот у нас есть стандартная функция void * realloc( void * ptrmem, size_t size ) Как известно, при перераспределении блока памяти, он...

Что это такое ? работает память на 2666гц или 1333гц ?
как понять работает ли память на 2666 или нет? я так понимаю 1333 это в простое ? помогите разобраться,пожалуйста! включил D.C.O.P или...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru