Как использовать 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
есть ли способ получить старое значение, или оно "просочилось" с нашей точки зрения? Ожидается, что вы сообщите ОС, когда закончите с malloc
ed памяти, позвонив 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);