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
}

Другими словами:

  1. Он пытается выделить достаточно памяти для хранения старой строки (плюс символ "\ 0", чтобы отметить конец строки).

  2. Если распределение не удалось, оно устанавливает errno в ENOMEM и немедленно возвращает NULL. Установка errno в ENOMEM - это что-то, что malloc делает в POSIX, поэтому нам не нужно явно делать это в нашей strdup. Если вы не совместимы с POSIX, ISO C на самом деле не гарантирует существование ENOMEM поэтому я не включил здесь (b).

  3. В противном случае распределение работало, поэтому мы копируем старую строку в новую строку и возвращаем новый адрес (на который вызывающий абонент отвечает за освобождение в какой-то момент).

Имейте в виду, что концептуальное определение. Любой архитектор библиотеки, заслуживающий своей зарплаты, может предоставить сильно оптимизированный код, предназначенный для конкретного используемого процессора.


(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 достаточно