Какова цель функции 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 достаточно