strdup () - что он делает в C?
какова цель strdup()
функция в C?
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
toENOMEM
и возвращаетNULL
немедленно. Установкаerrno
toENOMEM
что-тоmalloc
делает в POSIX, поэтому нам не нужно явно делать это в нашемstrdup
. Если ты не POSIX совместимый, ISO C фактически не санкционирует существованиеENOMEM
поэтому я не включил это вот!--26-->(b).в противном случае распределение работало, поэтому мы копируем старую строку в новую строку и возвращаем новый адрес (который вызывающий отвечает за освобождение в какой-то момент).
имейте в виду, что это концептуальное определение. Любой писатель библиотеки, достойный их зарплаты, мог предоставить сильно оптимизированный код, нацеленный на конкретный используемый процессор.
(a) Keep in однако ум, который функционирует, начиная с 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 человек:
на strdup()
функция возвращает указатель на новую строку, которая является дубликатом строки, на которую указывает s1
. Возвращенный указатель может быть передан в free()
. Возвращается указатель null, если новая строка не создается.
Он делает дубликат копии строки, переданной при запуске Танос и strcpy переданной строки. Буфер malloc'Ed возвращается вызывающему объекту, следовательно, необходимо запустить свободный на возвращаемое значение.
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);
на 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 достаточно