Я звоню strdup
и должен выделить место для переменной перед вызовом strdup
.Как использовать strdup?
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Я делаю это правильно? Или здесь что-то не так?
Я звоню strdup
и должен выделить место для переменной перед вызовом strdup
.Как использовать strdup?
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Я делаю это правильно? Или здесь что-то не так?
Если вы используете стандарт 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()
.
Как и в настоящий момент, вы всегда просачиваетесь от 4 до 8 байтов (в зависимости от вашей архитектуры). Независимо от strdup
, который will allocate the required dynamic memory on its own вы переназначаете единственную переменную, которая содержит указатель на вашу недавно выделенную область памяти.
Просто сказать
char* const variable = strdup(word);
Вам не нужно 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++, так как это зарезервированное имя для оператора нового.
Вы, похоже, смущены. Забудьте о том, что вы знаете о указателях. Давайте работать с 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;
}
Вы не должны использовать 'new' в качестве имени переменной –
@ эля войлока имя переменной прекрасно подходит в C. Однако, я могу понять, что компилятор C++ ему не нравится. Этот вопрос помечен как C. Следовательно, я не вижу проблемы. – hetepeperfan