2013-02-19 1 views
10

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

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

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

ответ

17

Если вы используете стандарт 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().

2

Как и в настоящий момент, вы всегда просачиваетесь от 4 до 8 байтов (в зависимости от вашей архитектуры). Независимо от strdup, который will allocate the required dynamic memory on its own вы переназначаете единственную переменную, которая содержит указатель на вашу недавно выделенную область памяти.

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

char* const variable = strdup(word); 
9

Вам не нужно Alloc пространства для использования с 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++, как имя переменной новое хорошо в C, а не в C++, так как это зарезервированное имя для оператора нового.

+0

Вы не должны использовать 'new' в качестве имени переменной –

+0

@ эля войлока имя переменной прекрасно подходит в C. Однако, я могу понять, что компилятор C++ ему не нравится. Этот вопрос помечен как C. Следовательно, я не вижу проблемы. – hetepeperfan

6

Вы, похоже, смущены. Забудьте о том, что вы знаете о указателях. Давайте работать с 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 

Есть ли какой-либо способ для нас восстановить старую ценность, или она «просочилась» с нашего зрения? Предположим, что вы ожидали, что OS сообщит, что вы закончили с этим случайным числом, чтобы ОС выполняла некоторые задачи очистки.

Старая стоимость, необходимая для генерации нового значения? Как это может быть, когда 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 

Есть ли способ для нас, чтобы получить старое значение, или это «утечка» из нашей точки зрения?Ожидается, что OS сообщит, когда закончите с malloc ed memory, позвонив по номеру 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; 
}