Как использовать strdup?

Я призываю strdup и нужно выделить пространство для переменной перед вызовом strdup.

char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);

правильно ли я это делаю? Или здесь что-то не так?

4 ответов


если вы используете стандарт POSIX strdup(), он вычисляет необходимое пространство и выделяет его и копирует исходную строку во вновь выделенное пространство. Вам не нужно делать malloc() себя; действительно, он немедленно протекает, если вы это сделаете, так как вы перезаписываете единственный указатель на пространство, которое вы выделили указателем на пространство, которое strdup() выделено.

отсюда:

char *variable = strdup(word);
if (variable == 0) …process out of memory error; do not continue…
…use variable…
free(variable);

Если вам нужно сделать распределение памяти, то вы нужно выделить strlen(word)+1 байт variable и вы можете скопировать word во вновь выделенное пространство.

char *variable = malloc(strlen(word)+1);
if (variable == 0) …process out of memory error; do not continue…
strcpy(variable, word);
…use variable…
free(variable);

или вычислить длину один раз и использовать memmove() или, возможно,memcpy():

size_t len = strlen(word) + 1;
char *variable = malloc(len);
if (variable == 0) …process out of memory error; do not continue…
memmove(variable, word, len);
…use variable…
free(variable);

не забудьте убедиться, что вы знаете, где free() для каждого malloc().


вам не нужно выделять пространство для использования с strdup, strdup сделает это за вас. Однако вы должны освободить его после использования.

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (){

    const char* s1= "Hello World";
    char* new = strdup (s1);
    assert (new != NULL);

    fprintf( stdout , "%s\n", new);

    free (new);
    return 0;
}

редактировать: будьте осторожны с C++ , поскольку имя переменной new прекрасно в C, а не в C++, поскольку это зарезервированное имя для оператора new.


Вы, кажется, запутались. Забудь, что ты знаешь о указателях. Давайте работать с ints.

int x;
x = rand();    // Let us consider this the "old value" of x
x = getchar(); // Let us consider this the "new value" of x

есть ли способ получить старое значение, или оно "просочилось" с нашей точки зрения? Гипотетически предположим, что вы должны были сообщить ОС, что вы закончили с этим случайным числом, чтобы ОС выполнила некоторые задачи очистки.

требуется ли старое значение для генерации нового значения? Как это может быть, когда getchar не вижу x?

Давайте теперь рассмотрим код:

char *variable;
variable = (char*) malloc(sizeof(char*)); // Let us consider this the "old value" of variable
variable = strdup(word);                  // Let us consider this the "new value" of variable

есть ли способ получить старое значение, или оно "просочилось" с нашей точки зрения? Ожидается, что вы сообщите ОС, когда закончите с malloced памяти, позвонив free(variable);.

требуется ли старое значение для генерации нового значения? Как это может быть, когда strdup не вижу переменной?

FYI, вот пример того, как strdup может быть реализован:

char *strdup(const char *original) {
    char *duplicate = malloc(strlen(original) + 1);
    if (duplicate == NULL) { return NULL; }

    strcpy(duplicate, original);
    return duplicate;
}

В настоящее время вы всегда протекает от 4 до 8 байт (в зависимости от вашей архитектуры). Независимо от strdup, который выделит необходимую динамическую память самостоятельно вы переназначаете единственную переменную, которая содержит указатель на новую область памяти malloced.

просто сказать

char* const variable = strdup(word);