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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Sergooor
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 71
#1

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

18.11.2014, 08:39. Просмотров 575. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 08:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая память. Что такое realloc? (C++):

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

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

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? - C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main()...

Что такое хэндлер файла? Что такое файловый указатель? - C++
Что такое хэндлер файла? Что такое файловый указатель?

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

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

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

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

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

ТАК да?

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

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


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

Добавлено через 10 минут
Ладно.Скажите тогда пожалуйста как работает realloc с такой записью и все)Что вовзрашает,и что происходить с параметрами
str=realloc(str,100)
0
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,676
Записей в блоге: 6
Завершенные тесты: 2
19.11.2014, 16:44 #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;
}
0
19.11.2014, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 16:44
Привет! Вот еще темы с ответами:

Динамическая память [new] - C++
Если записать так: char *p; p = new char; cin&gt;&gt;p; for(int i=0; i&lt;strlen(p); i++) cout&lt;&lt;p&lt;&lt;endl;

Динамическая память - C++
Каким способом можно задать динамическую память , кроме как через new ?

Динамическая память с++ - C++
Как использовать динамическую память в с++

Динамическая память. - C++
Всем привет! Уважаемые знатоки, можете посмотреть мою реализацию класса вектор? У меня при их большем количестве в программе вечно...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru