Какова цель функции strdup()
в C?
Strdup() - что он делает в C?
Ответ 1
Точно, как это звучит, предполагая, что вы привыкли к сокращенному пути, в котором 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
и строчной буквы, могут быть добавлены к объявлениям в заголовке<string.h>
.
(b) Изменение в основном будет заменено, if (d == NULL) return NULL;
с:
if (d == NULL) {
errno = ENOMEM;
return NULL;
}
Ответ 2
char * strdup(const char * s)
{
size_t len = 1+strlen(s);
char *p = malloc(len);
return p ? memcpy(p, s, len) : NULL;
}
Возможно, код немного быстрее, чем с strcpy()
, поскольку \0
char не нужно искать снова (он уже был с strlen()
).
Ответ 3
Нет смысла повторять другие ответы, но учтите, что strdup()
может делать все, что захочет, с точки зрения C, так как не является частью какого-либо стандарта C. Однако он определяется POSIX.1-2001.
Ответ 4
Из strdup man:
Функция strdup()
должна возвращать указатель на новую строку, которая является дубликатом строки, на которую указывает s1
. Возвращаемый указатель можно передать в free()
. Возвращает нулевой указатель, если новая строка не может быть создана.
Ответ 5
Он создает дублируемую копию строки, переданной с помощью malloc и strcpy строки, переданной в. Буфер malloc'ed возвращается вызывающему, следовательно, необходимо запустить бесплатно по возвращаемому значению.
Ответ 6
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
}
Итак, что он делает, это дать нам еще одну строку, идентичную строке, заданной его аргументом, без необходимости выделять память. Но нам еще нужно освободить его позже.
Ответ 7
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
всегда нулевая, заканчивая скопированную строку.
Ответ 8
Самое ценное, что он делает, это дать вам еще одну строку, идентичную первой, без необходимости выделять память (местоположение и размер) самостоятельно. Но, как уже отмечалось, вам все равно нужно освободить его (но это также не требует вычисления количества).
Ответ 9
Функция strdup() является сокращением для строкового дубликата, она принимает параметр как строчную константу или строковый литерал и выделяет достаточно места для строки и записывает соответствующие символы в выделенном пространстве и, наконец, возвращает адрес от выделенного пространства к вызывающей процедуре.
Ответ 10
Это Simple strcpy(ptr2, ptr1)
эквивалентно while(*ptr2++ = *ptr1++)
, где as: strdup эквивалентно
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Итак, если вы хотите, чтобы строка, которую вы скопировали, использовалась в другой функции (поскольку она создана в разделе кучи), вы можете использовать strdup, иначе strcpy достаточно