How do I use strdup?

Ivan Zhang picture Ivan Zhang · Feb 19, 2013 · Viewed 47.1k times · Source

I am calling strdup and have to allocate space for the variable before calling strdup.

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

Am I doing this right? Or is there something wrong here?

Answer

Jonathan Leffler picture Jonathan Leffler · Feb 19, 2013

If you're using the POSIX standard strdup(), it calculates the space needed and allocates it and copies the source string into the newly allocated space. You don't need to do a malloc() yourself; indeed, it immediately leaks if you do it since you overwrite the only pointer to the space you allocated with the pointer to the space that strdup() allocated.

Hence:

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

If you do need to do the memory allocation, then you need to allocate strlen(word)+1 bytes in variable and you can then copy word into that newly allocated space.

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

Or calculate the length once and use memmove() or perhaps 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);

Don't forget to ensure you know where the free() is for every malloc().