С компьютерами сегодняшнего дня вы можете избавиться от выделения очень больших строк (сотни тысяч символов), в то время как вряд ли сделайте вмятину в использовании ОЗУ компьютера. Поэтому я не стал бы слишком беспокоиться.
Однако, в прежние времена, когда память была на высоте, обычной практикой было чтение строк в кусках. fgets
считывает до максимального количества символов из ввода, но оставляет остальную часть входного буфера неповрежденной, поэтому вы можете прочитать остальное от него, как вам нравится.
в этом примере, я читал в кусках 200 символов, но вы можете использовать любой размер блока, который вы хотите, конечно.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readinput()
{
#define CHUNK 200
char* input = NULL;
char tempbuf[CHUNK];
size_t inputlen = 0, templen = 0;
do {
fgets(tempbuf, CHUNK, stdin);
templen = strlen(tempbuf);
inputlen += templen;
input = realloc(input, inputlen+1);
strcat(input, tempbuf);
} while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n');
return input;
}
int main()
{
char* result = readinput();
printf("And the result is [%s]\n", result);
free(result);
return 0;
}
Обратите внимание, что это упрощенный пример без проверки ошибок; в реальной жизни вам нужно будет убедиться, что ввод в порядке, подтвердив возвращаемое значение fgets
.
Также обратите внимание, что в конце, если процедура readinput, никакие байты не теряются; строка имеет точный размер памяти, который должен иметь.
Knuth отклоняет термин "куча", используемая в качестве синонима для хранилища свободной памяти.
Несколько авторов начали приблизительно в 1975 называть пул доступной памяти "кучей". Но в существующем ряду книг, мы будем использовать то слово только в его более традиционном смысле, связанном с приоритетными очередями. ( Фундаментальные Алгоритмы, 3-й редактор , p. 435)
Если это имеет значение ALGOL68, который предшествовал C, имел фактическое ключевое слово heap
, которое использовалось для выделения места для переменной от "глобальной "кучи"", в противоположность loc
, который выделил его на стеке.
, Но я подозреваю, что использование может состоять просто в том, потому что нет никакой реальной структуры к нему. Этим я подразумеваю, что Вы, как гарантируют, не получите хорошо-пригодный блок или следующий блок в памяти, скорее Вы возьмете то, что Вам дают в зависимости от прихотей стратегии выделения.
Как большинство имен, это, вероятно, думалось некоторым кодером, которому просто было нужно имя.
я часто слышал о нем называемый ареной иногда (сообщение об ошибке, от многие луны назад говоря, что "арена памяти была повреждена"). Это поднимает изображения блоков сражения выполнения памяти в гладиаторском стиле в Вашем адресном пространстве (а-ля фильм Трон).
Нижняя строка, это - просто название области памяти, Вы могли точно также назвать это пулом кирпича или sbrk-пулом (после того, как вызовы для изменения его) или любое из дюжины других имен.
я помню, когда мы соединяли comms стеки протоколов даже перед OSI модель, с 7 слоями была мерцанием в чьем-то глазу, мы использовали многоуровневый подход и должны были придумать имена на каждом слое для блоков.
Мы использовали блоки, сегменты, блоки, разделы и различные другие имена, все, что просто указало на вещь фиксированной длины. Может случиться так, что "куча" возникла:
Carol: "Эй, Bob, что такое хорошее название структуры данных, которая просто скупо выдает случайные биты памяти от большой площади?"
Bob: "Как насчет 'дымящейся груды экскрементов лошади'?"
Carol: "Спасибо, Bob, я просто выберу '"кучу"', если это будет хорошо с Вами. Между прочим, как дела идут с разводом?"
Это назвало "кучу" для контрастирующего изображения, до которого это колдует что стек .
В стопке объектов, объекты находятся один сверху другого в порядке, они были размещены туда, и можно только удалить лучший (не сваливая все это).
В "куче", нет никакого особого порядка к способу, которым помещаются объекты. Можно достигнуть в и удалить объекты в любом порядке, потому что нет никакого ясного 'главного' объекта.
Это делает довольно хорошее задание описания двух способов выделить и освободить память в стеке и "куче". Конфетка!
Я не знаю, является ли это первым, но Алгол 68 имел ключевое слово '"куча"' для выделения памяти от "кучи" свободной памяти.
первое использование '"кучи"', вероятно, будет найдено где-нибудь между 1958, когда John McCarthy изобрел сборку "мусора" для Lisp и разработку Алгола 68
Это не заказано. "Куча" устройства хранения данных.
Это не заказанный структура данных "кучи" .
Точно так же, как Java и JavaScript, "кучу" (свободное хранилище) и "кучу" (структура данных) называют таким, чтобы обеспечить, чтобы наше братство было непроницаемо посторонним, таким образом храня верность нашей безопасной работе.
Это - большая, запутанная груда неорганизованного спама, в котором ничто не может быть найдено, если Вы не знаете точно, где посмотреть.
Я всегда полагал, что это был своего рода умный способ описать это по сравнению со стеком. "Куча" похожа на переросший, неорганизованный стек.
"Куча" обычно имеет эти функции:
Вы не можете предсказать адрес блока malloc () возвраты.
Вы понятия не имеете о том, как адрес, возвращенный следующим malloc (), связан с адресом предыдущего.
Вы можете malloc () блоки переменных размеров.
, Таким образом, у Вас есть что-то, что может сохранить набор блоков переменных размеров и возвратить их в некотором обычно непредсказуемом порядке. Как еще Вы назвали бы его если не "куча"?