10 ответов:
именно так это звучит, предполагая, что вы привыкли к сокращенному способу, которым C и UNIX назначают слова, это дубликаты строк : -)
имея в виду, что это на самом деле не является частью самого стандарта ISO C(a) (это POSIX вещь), он эффективно делает то же самое, что и следующий код:
char *strdup (const char *s) { char *d = malloc (strlen (s) + 1); // Space for length plus nul if (d == NULL) return NULL; // No memory strcpy (d,s); // Copy the characters return d; // Return the new string }другими словами:
он пытается выделить достаточно памяти для хранения старая строка (плюс символ '\0 ' для обозначения конца строки).
если выделение не удалось, он устанавливает
errnoдоENOMEMи возвращаетNULLнемедленно. УстановкаerrnoдоENOMEMчто-тоmallocделает в POSIX, поэтому нам не нужно явно делать это в нашемstrdup. Если ты не POSIX совместимый, ISO C фактически не требует существованияENOMEMпоэтому я не включил это здесь(b).в противном случае распределение работало, поэтому мы копируем старую строку в новую строку и возвращаем новый адрес (который вызывающий отвечает за освобождение в какой-то момент).
имейте в виду, что это концептуальное определение. Любой писатель библиотеки, стоящий их зарплаты, возможно, предоставил сильно оптимизированный код, нацеленный на конкретный используемый процессор.
(a) сохранить в однако имейте в виду, что функции начинаются с
strи строчная буква зарезервированы стандартом для будущих направлений. ОтC11 7.1.3 Reserved identifiers:каждый заголовок объявляет или определяет все идентификаторы, перечисленные в его связанном подпункте, и *необязательно объявляет или определяет идентификаторы, перечисленные в его связанном будущем подпункте направления библиотеки.**
будущие направления
string.hможно найти вC11 7.31.13 String handling <string.h>:имена функций, которые начинаются с
str,memилиwcsи строчная буква может быть добавлена к объявлениям в .
(b) изменение в основном будет заменять
if (d == NULL) return NULL;С:if (d == NULL) { errno = ENOMEM; return NULL; }
char * strdup(const char * s) { size_t len = 1+strlen(s); char *p = malloc(len); return p ? memcpy(p, s, len) : NULL; }может быть, код немного быстрее, чем с
strcpy()какchar не нужно искать снова (это уже было сstrlen()).
нет смысла повторять другие ответы, но обратите внимание, что
strdup()можно делать все, что хочет, с точки зрения C, так как он не является частью стандарта C. Однако он определяется POSIX.1-2001.
С strdup man:
The
strdup()функция возвращает указатель на новую строку, которая является дубликатом строки, на которую указываетs1. Возвращенный указатель может быть передан вfree(). Если новая строка не может быть создана, возвращается нулевой указатель.
Он делает дубликат строки, переданной с помощью запуска malloc и strcpy переданной строки. Функции malloc и объед буфер возвращается вызывающему объекту, следовательно, необходимо работать свободный на возвращаемое значение.
strdup () выполняет динамическое выделение памяти для массива символов, включая конечный символ '\0', и возвращает адрес памяти кучи:
char *strdup (const char *s) { char *p = malloc (strlen (s) + 1); // allocate memory if (p != NULL) strcpy (p,s); // copy string return p; // return the memory }таким образом, он дает нам другую строку, идентичную строке, заданной его аргументом, не требуя от нас выделения памяти. Но мы все равно должны освободить его позже.
strdupиstrndupопределяются в POSIX-совместимых системах как:char *strdup(const char *str); char *strndup(const char *str, size_t len);The strdup () функция выделяет достаточно памяти для копии строка
str, делает копию и возвращает указатель на него.указатель может впоследствии использоваться в качестве аргумента функции
free.если недостаточно памяти,
NULLиerrnoустановленоENOMEM.в strndup() функция копирует не более
lenсимволы из строкиstrвсегда null завершает скопированную строку.
самое ценное, что он делает, это дает вам другую строку, идентичную первой, не требуя от вас выделения памяти (местоположение и размер) самостоятельно. Но, как уже отмечалось, вам все равно нужно освободить его (но это также не требует расчета количества.)
функция strdup () является сокращением для дубликата строки, она принимает параметр как строковую константу или строковый литерал и выделяет достаточно места для строки и записывает соответствующие символы в выделенное пространство и, наконец, возвращает адрес выделенного пространства вызывающей подпрограмме.
Это просто
strcpy(ptr2, ptr1)эквивалентноwhile(*ptr2++ = *ptr1++)где: strdup эквивалентно
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);поэтому, если вы хотите, чтобы строка, которую вы скопировали, использовалась в другой функции (так как она создана в разделе кучи) , вы можете использовать strdup, иначе strcpy достаточно
Comments