История изменений
Исправление
Norong,
(текущая версия)
:
Я в учебнике прочитал описания двух функций, и не совсем понял пару моментов.
Функция ungetc. Помещает символ «c» назад в файл «fp» и возвращает либо «c», либо EOF в случае ошибки. Для каждого файла гарантирован возврат только одного символа.
Как происходит «возврат» символа в файл в случае работы с обычным файлом и в случае с stdin? Раньше в учебнике была реализована функция, выполняющая схожую роль, она записывала символы в отдельный буфер, а для чтения символов использовалась функция-обёртка над этим буфером и над обычным getchar(). И не совсем ясно про «гарантирован возврат только одного символа». Как я понимаю, это значит, что один символ я в любом случае смогу вернуть в файл. А что может мне помешать вернуть больше, и чем обусловлена гарантия?
Дальше:
Функция free(p) освобождает участок памяти, на который указывает указатель p. ... Порядок освобождения выделенных участков памяти не регламентируется. Однако если указатель не был получен с помощью malloc или calloc, то его освобождение является грубой ошибкой. Обращение по указателю после его освобождения - также ошибка. <дальше пример правильного освобождения связанного списка> В разделе 8.7 показана реализация функции распределения памяти наподобие malloc, в которой выделенные блоки можно освобождать в любом порядке.
Тут не понял про особенности, связанные с порядком. Если я выделил несколько областей памяти и на каждую имею указатель, я же могу их в любом порядке обратно высвобождать, вроде. Или здесь речь именно о том, чтобы не потерять указатель на другую область при высвобождении, например, того же связанного списка? В раздел 8.7 заглянул, там о том, что
свободная память будет храниться в виде списка свободных блоков. Каждый блок содержит свой размер, указатель на следующий блок, и сам участок памяти.
Там ещё много текста, но, вроде, основная мысль в этом.
Ну и тут есть одно задание:
Такие функции, как isupper, можно реализовать с позиций экономии времени, а можно с позиций экономии места. Исследуйте обе возможности.
isupper же - функция проверки, является ли аргумент функции символом в верхнем регистре. Мне приходит в голову один единственный способ такой проверки: if (c >= A && c <= Z). Вроде, он настолько примитивный, что тут ни время не тратится, ни память. Чего ждёт от меня автор?
Пожалуйста, помоги мне разобраться с этими вопросами. Заранее большое спасибо.
Исходная версия
Norong,
:
Я в учебнике прочитал описания двух функций, и не совсем понял пару моментов.
Функция ungetc. Помещает символ «c» назад в файл «fp» и возвращает либо «c», либо EOF в случае ошибки. Для каждого файла гарантирован возврат только одного символа.
Как происходит «возврат» символа в файл в случае работы с обычным файлом и в случае с stdin? Раньше в учебнике была реализована функция, выполняющая схожую роль, она записывала символы в отдельный буфер, а для чтения символов использовалась функция-обёртка над этим буфером и над обычным getchar(). И не совсем ясно про «гарантирован возврат только одного символа». Как я понимаю, это значит, что один символ я в любом случае смогу вернуть в файл. А что может мне помешать вернуть больше, и чем обусловлена гарантия?
Дальше:
Функция free(p) освобождает участок памяти, на который указывает указатель p. ... Порядок освобождения выделенных участков памяти не регламентируется. Однако если указатель не был получен с помощью malloc или calloc, то его освобождение является грубой ошибкой. Обращение по указателю после его освобождения - также ошибка. <дальше пример правильного освобождения связанного списка> В разделе 8.7 показана реализация функции распределения памяти наподобие malloc, в которой выделенные блоки можно освобождать в любом порядке.
Тут не понял про особенности, связанные с порядком. Если я выделил несколько областей памяти и на каждую имею указатель, я же могу их в любом порядке обратно высвобождать, вроде. Или здесь речь именно о том, чтобы не потерять указатель на другую область при высвобождении, например, того же связанного списка? В раздел 8.7 заглянул, там о том, что
свободная память будет храниться в виде списка свободных блоков. Каждый блок содержит свой размер, указатель на следующий блок, и сам участок памяти.
Там ещё много текста, но, вроде, основная мысль в этом.
Ну и тут есть одно задание:
Такие функции, как isupper, можно реализовать с позиций экономии времени, а можно с позиций экономии места. Исследуйте обе возможности.
Вот это я совсем не понял. isupper же - функция проверки, является ли аргумент функции символом в верхнем регистре. Мне приходит в голову один единственный способ такой проверки: if (c >= A && c <= Z). Вроде, он настолько примитивный, что тут ни время не тратится, ни память. Чего ждёт от меня автор?
Пожалуйста, помоги мне разобраться с этими вопросами. Заранее большое спасибо.