Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
18.11.2014, 08:39     Динамическая память. Что такое realloc? #1
Препод ни в какую не принимает ответы.Я начинающий(занимаюсь 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;Верно?

Объясните пожалуйста.Заранее спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 08:39     Динамическая память. Что такое realloc?
Посмотрите здесь:

Динамическая память C++
C++ Динамическая память
Статическая память,Динамическая память. C++
C++ Динамическая память
Динамическая память C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.11.2014, 08:41     Динамическая память. Что такое realloc? #2
Sergooor, документацию читали?
http://www.opennet.ru/cgi-bin/openne...?topic=realloc
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
18.11.2014, 09:15  [ТС]     Динамическая память. Что такое realloc? #3
Да,читал.Вот что я ему ответил.Если я не прав пожалуйста напишите как верно.
p = (char*)realloc(s,100);
p - указатель на на новый блок памяти размером 100
s- указатель на начало блока памяти размеров 100
А в чем отличие указателей s и p затрудняюсь.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.11.2014, 09:22     Динамическая память. Что такое realloc? #4
Sergooor, если взять отдельную строчку, то да: s - указатель на старый блок, p - на новый.
Только логики в алгоритме нет. Зачем выделять 100 байтов памяти, а затем перевыделять столько же?
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
18.11.2014, 09:32  [ТС]     Динамическая память. Что такое realloc? #5
Ой в malloс(1) должно быть.
Про отдельную строчку он говорит не верно(про realloc) мол по другому все.
Еще спрашивает в чем разница между p и s?И куда записывается p и куда s.Как ему ответить?
А про s=p я верно сказал?Или ту ошибка?(то что,указателю s присваивается значение указателя p)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.11.2014, 10:06     Динамическая память. Что такое realloc? #6
Цитата Сообщение от Sergooor Посмотреть сообщение
А про s=p я верно сказал?Или ту ошибка?(то что,указателю s присваивается значение указателя p)
Все ок, после этого присваивания оба указателя указывают на одну и ту же область памяти.
Цитата Сообщение от Sergooor Посмотреть сообщение
Еще спрашивает в чем разница между p и s?И куда записывается p и куда s.Как ему ответить?
При такой формулировке вопроса мне непонятно какой ответ ожидается.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2781 / 1427 / 393
Регистрация: 18.10.2014
Сообщений: 2,620
18.11.2014, 10:08     Динамическая память. Что такое realloc? #7
Цитата Сообщение от Sergooor Посмотреть сообщение
Да,читал.Вот что я ему ответил.Если я не прав пожалуйста напишите как верно.
p = (char*)realloc(s,100);
p - указатель на на новый блок памяти размером 100
s- указатель на начало блока памяти размеров 100
А в чем отличие указателей s и p затрудняюсь.
Вам же вроде ясно объясняли, что после такого вызова 'realloc' указатель 's' в общем случае становится "мусором" (если 'realloc' прошел успешно). А вы говорите, что мол "s - указатель на начало блока памяти размеров 100". Это не верно.

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

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

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

Добавлено через 1 час 40 минут
Или нет?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
18.11.2014, 19:57     Динамическая память. Что такое realloc? #9
Цитата Сообщение от Sergooor Посмотреть сообщение
Тогда в этом случае получается, что новый и старый блоки памяти будут начинаться с одинакового адреса ?
это уже как менеджеру памяти угодно будет
str будет указывать на выделенный блок памяти
а уж совпадает он с предыдущим или нет кого это волнует
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
19.11.2014, 13:21  [ТС]     Динамическая память. Что такое realloc? #10
str( указатель на новый блок памяти) = realloc(str(указатель на освобожденную память т.е как писал другой человек мусор),100);

ТАК да?

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

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


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

Добавлено через 10 минут
Ладно.Скажите тогда пожалуйста как работает realloc с такой записью и все)Что вовзрашает,и что происходить с параметрами
str=realloc(str,100)
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
19.11.2014, 16:44     Динамическая память. Что такое realloc? #15
примерно как реализован 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;
}
DrOffset
6418 / 3792 / 876
Регистрация: 30.01.2014
Сообщений: 6,579
19.11.2014, 16:48     Динамическая память. Что такое realloc? #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Sergooor Посмотреть сообщение
но если я запишу так str = (char*)realloc(str,100) то это тоже работает. и блок памяти тот же
Он тебя путает специально.
Блоки памяти разные. Просто указатель один.
При передаче в realloc, str, который в параметре, указывает на старый блок памяти.
Потом идет работа функции realloc, она в общем случае выделяет новый блок, а старый освобождает. Пока мы не присвоили результат работы realloc некоему указателю, str указывает на освобожденную память (все так же как и в других примерах, которые объясняли выше). После присвоения результата работы realloc указателю str, он начинает указывать на новый блок памяти. Короче говоря, здесь все тоже самое, что и в предыдущих примерах, просто вместо двух экземпляров указателей используется один.
Здесь важно понимать, что значение указателя в параметре копируется при передаче в realloc (т.е. realloc не меняет значение адреса, хранимого в str, через свой параметр).
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
19.11.2014, 16:54  [ТС]     Динамическая память. Что такое realloc? #17
вот он наверно от меня последнюю строчку ждал вашего ответа
0x10
19.11.2014, 18:15
  #18

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 19:04     Динамическая память. Что такое realloc?
Еще ссылки по теме:

Динамическая память C++
Динамическая память C++
C++ Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?

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

Или воспользуйтесь поиском по форуму:
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 70
19.11.2014, 19:04  [ТС]     Динамическая память. Что такое realloc? #19
в пятницу к нему пойду )озвучу ответ последний)если не правильно скажет, я вообще не знаю чо делать)
Yandex
Объявления
19.11.2014, 19:04     Динамическая память. Что такое realloc?
Ответ Создать тему
Опции темы

Текущее время: 14:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru