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

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

18.11.2014, 08:39. Показов 1502. Ответов 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
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru