Указатель на char*
указатель для адреса динамически выделенного буфера. Чтобы getline()
сделала всю работу, он должен быть инициализирован NULL
. В противном случае, он должен указывать на область памяти, выделенную с помощью malloc()
.
size_t *n
Указатель на размер буфера. Если вы выделяете свой собственный буфер, *n
должно содержать размер буфера. Обе функции обновляют *n
новым значением размера буфера, если они его изменяют.
FILE* stream
Место, откуда следует получать входные символы.
По достижении конца файла или при ошибке функция возвращает -1. Строки содержат завершающий символ конца строки или разделитель (если он есть), а также завершающий нулевой байт. Использование getline()
просто, как показано в ch03-getline.с
:
/* ch03-getline.c --- демонстрация getline(). */
#define _GNU_SOURCE 1
#include
#include
/* main - прочесть строку и отобразить ее, пока не достигнут EOF */
int main(void) {
char *line = NULL;
size_t size = 0;
ssize_t ret;
while ((ret = getline(&line, &size, stdin)) != -1)
printf("(%lu) %s", size, line);
return 0;
}
Вот эта функция в действии, показывающая размер буфера. Третья входная и выходная строки намеренно длинные, чтобы заставить getline()
увеличить размер буфера:
$ ch03-getline /* Запустить программу */
this is a line
(120) this is a line
And another line.
(120) And another line.
A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee
(240) A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee
3.2.2. Копирование строк: strdup()
Одной чрезвычайно типичной операцией является выделение памяти для копирования строки. Это настолько типично, что многие программисты предусматривают для нее простую функцию вместо использования внутритекстового кодирования, и часто эта функция называется strdup()
:
#include
/* strdup --- выделить память с malloc() и скопировать строку */
char *strdup(const char *str) {
size_t len;
char *copy;
len = strlen(str) + 1;
/* включить место для завершающего '\0' */
copy = malloc(len);
if (copy != NULL) strcpy(copy, str);
return copy; /* при ошибке возвращает NULL */
}
С появлением стандарта POSIX 2001 программисты по всему миру могут вздохнуть свободнее: эта функция является теперь частью POSIX в виде расширения XSI:
#include
char *strdup(const char *str); /* Копировать str */
Возвращаемое значение равно NULL
, если была ошибка, или указатель на динамически выделенную память с копией str
. Возвращенное значение должно быть освобождено с помощью free()
, когда больше не требуется.
3.2.3. Системные вызовы: brk()
и sbrk()
Четыре функции, которые мы рассмотрели (malloc()
, calloc()
, realloc()
и free()
) являются стандартными, переносимыми функциями для управления динамической памятью.
На Unix-системах стандартные функции реализованы поверх двух дополнительных, очень примитивных процедур, которые непосредственно изменяют размер адресного пространства процесса. Мы представляем их здесь, чтобы помочь вам понять, как работают GNU/Linux и Unix (снова «под капотом»); крайне маловероятно, что вам когда-нибудь понадобится использовать эти функции в обычных программах. Они определены следующим образом:
#include
#include
int brk(void *end_data_segment);
void *sbrk(ptrdiff_t increment);